Zoeken…


Invoering

De select trefwoord biedt een eenvoudige methode om te werken met kanalen en het uitvoeren van meer geavanceerde taken. Het wordt vaak gebruikt voor een aantal doeleinden: - Omgaan met time-outs. - Wanneer er meerdere kanalen zijn om van te lezen, zal de select willekeurig lezen van één kanaal met gegevens. - Biedt een eenvoudige manier om te definiëren wat er gebeurt als er geen gegevens beschikbaar zijn op een kanaal.

Syntaxis

  • selecteer {}
  • selecteer {case true:}
  • selecteer {case inkomende gegevens: = <-someChannel:}
  • selecteer {standaard:}

Eenvoudig selecteren Werken met kanalen

In dit voorbeeld maken we een goroutine (een functie die in een afzonderlijke thread wordt uitgevoerd) die een chan parameter accepteert en eenvoudigweg lussen uitvoert en elke keer informatie naar het kanaal verzendt.

In het main hebben we een for loop en een select . De select zal de verwerking blokkeren totdat een van de case statements waar wordt. Hier hebben we twee zaken verklaard; de eerste is wanneer informatie via het kanaal komt, en de andere is als er geen ander geval optreedt, dat bekend staat als default .

// Use of the select statement with channels (no timeouts)
package main

import (
    "fmt"
    "time"
)

// Function that is "chatty"
// Takes a single parameter a channel to send messages down
func chatter(chatChannel chan<- string) {
    // Clean up our channel when we are done.
    // The channel writer should always be the one to close a channel.
    defer close(chatChannel)

    // loop five times and die
    for i := 1; i <= 5; i++ {
        time.Sleep(2 * time.Second) // sleep for 2 seconds
        chatChannel <- fmt.Sprintf("This is pass number %d of chatter", i)
    }
}

// Our main function
func main() {
    // Create the channel
    chatChannel := make(chan string, 1)

    // start a go routine with chatter (separate, non blocking)
    go chatter(chatChannel)

    // This for loop keeps things going while the chatter is sleeping
    for {
        // select statement will block this thread until one of the two conditions below is met
        // because we have a default, we will hit default any time the chatter isn't chatting
        select {
        // anytime the chatter chats, we'll catch it and output it
        case spam, ok := <-chatChannel:
            // Print the string from the channel, unless the channel is closed
            // and we're out of data, in which case exit.
            if ok {
                fmt.Println(spam)
            } else {
                fmt.Println("Channel closed, exiting!")
                return
            }
        default:
            // print a line, then sleep for 1 second.
            fmt.Println("Nothing happened this second.")
            time.Sleep(1 * time.Second)
        }
    }
}

Probeer het op de Go Playground!

Select gebruiken met time-outs

Dus hier heb ik de for lussen verwijderd en een time-out gemaakt door een tweede case te voegen aan de select die na 3 seconden terugkeert. Omdat de select gewoon wacht totdat ELKE case waar is, wordt de tweede case geactiveerd en eindigt ons script en krijgt chatter() zelfs geen kans om te voltooien.

// Use of the select statement with channels, for timeouts, etc.
package main

import (
    "fmt"
    "time"
)

// Function that is "chatty"
//Takes a single parameter a channel to send messages down
func chatter(chatChannel chan<- string) {
    // loop ten times and die
    time.Sleep(5 * time.Second) // sleep for 5 seconds
    chatChannel<- fmt.Sprintf("This is pass number %d of chatter", 1)
}

// out main function
func main() {
    // Create the channel, it will be taking only strings, no need for a buffer on this project
    chatChannel := make(chan string)
    // Clean up our channel when we are done
    defer close(chatChannel)

    // start a go routine with chatter (separate, no blocking)
    go chatter(chatChannel)

    // select statement will block this thread until one of the two conditions below is met
    // because we have a default, we will hit default any time the chatter isn't chatting
    select {
    // anytime the chatter chats, we'll catch it and output it
    case spam := <-chatChannel:
        fmt.Println(spam)
    // if the chatter takes more than 3 seconds to chat, stop waiting
    case <-time.After(3 * time.Second):
        fmt.Println("Ain't no time for that!")
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow