Подтвердить что ты не робот

Возвращает ли канал Go два значения?

Я видел код в этой ссылке и путался: http://www.darkcoding.net/software/go-lang-after-four-months/

Что означает значение второго значения (ok)?

for self.isRunning {

    select {
    case serverData, ok = <-fromServer:   // What the meaning of the second value(ok)?
        if ok {
            self.onServer(serverData)
        } else {
            self.isRunning = false
        }

    case userInput, ok = <-fromUser:
        if ok {
            self.onUser(userInput)
        } else {
            self.isRunning = false
        }
    }

}
4b9b3361

Ответ 1

Логическая переменная ok, возвращаемая оператором приема , указывает, было ли полученное значение отправлено по каналу (true) или равно нулю значение возвращается, потому что канал закрыт и пуст (false).

Цикл for завершается, когда какая-либо другая часть программы Go закрывает канал fromServer или fromUser. В этом случае один из операторов case установит ok в значение true. Поэтому, если пользователь закрывает соединение или удаленный сервер закрывает соединение, программа завершается.

http://play.golang.org/p/4fJDkgaa9O:

package main

import "runtime"

func onServer(i int) { println("S:", i) }
func onUser(i int)   { println("U:", i) }

func main() {
    fromServer, fromUser := make(chan int),make(chan int)
    var serverData, userInput int
    var ok bool

    go func() {
        fromServer <- 1
        fromUser <- 1
        close(fromServer)
        runtime.Gosched()
        fromUser <- 2
        close(fromUser)
    }()

    isRunning := true
    for isRunning {
        select {
            case serverData, ok = <-fromServer:
                if ok {
                    onServer(serverData)
                } else {
                    isRunning = false
                }

            case userInput, ok = <-fromUser:
                if ok {
                    onUser(userInput)
                } else {
                    isRunning = false
                }
            }
        }
        println("end")
}

Ответ 2

Несколько ответов процитировали спецификацию оператора приема, но чтобы понять, что вам, вероятно, необходимо прочитать спецификацию функции закрыть. Затем, поскольку вам будет интересно, почему эти функции такие, как они есть, читайте, как для оператора находится по каналу. Для оператора for требуется сигнал для остановки итерации, а close - это способ, по которому отправитель может сказать "больше данных".

С close и , ok = <-, отображаемыми как часть языка, вы можете использовать их в других случаях, когда вы хотите, чтобы отправка goroutine сигнализировала "больше никаких данных". Пример кода в вопросе - интересное использование этих функций. Он обрабатывает как "серверный" канал, так и "пользовательский" канал, и если из любого из них поступает сигнал "больше данных", он выходит из цикла.

Ответ 4

В Go функции и каналы могут возвращать более 1 значения. Здесь ok должно быть логической переменной с истинным (успешным) и ложным (неуспешно), а serverData - это фактические данные, полученные от канала.