Почему эти программы спят?

#go

#Вперед

Вопрос:

На мой взгляд, «выбрать … регистр» означает «Если доступен какой-либо канал, он выполняется».Итак, почему здесь ошибка, я думаю message<-msg , что доступна отправка chan, но это вызывает тупик!. большое спасибо.

 
import "fmt"

func main() {
    messages:=make(chan string)
    //signals:=make(chan string)

    select {
    case msg:=<-messages:
        fmt.Println(msg)
    default:
        fmt.Println("no mes receivedd")
    }

    msg:="h1"
    select {
    case messages<-msg:
        fmt.Println("sent message",msg)
    }
}
 

Ответ №1:

У первого выбора есть default случай, поэтому он выбрал это немедленно. Второй select пытается выполнить запись messages , но другие программы не прослушиваются, поэтому у вас тупик.

Переместите второй select перед первым, поместите его в программу и удалите default регистр, тогда у вас будет успешная отправка / получение.

Комментарии:

1. спасибо, у меня есть успешное обучение отправке и получению вами, но зачем мне нужно поместить второй выбор в программу ? Я пробую это, но это все еще тупик package main import "fmt" func main() { messages:=make(chan string) //signals:=make(chan string) msg:="h1" select { case messages<-msg: fmt.Println("sent message",msg) } select { case msg:=<-messages: fmt.Println(msg) default: fmt.Println("no mes receivedd") } }

Ответ №2:

введите описание изображения здесь
источник geeksforgeeks

Здесь у нас есть карта двух программ с двумя функциями. одна карта программы с функцией main и одна с анонимной функцией.

 package main

import (
    "fmt"
)

func main() {
    messages := make(chan string)
    //signals:=make(chan string)
    msg := "h1"
    go func(msg string) {
        select {
        case messages <- msg:
            fmt.Println("sent message", msg)
        }
    }(msg)

    select {
    case msg := <-messages:
        fmt.Println("Message recieved", msg)
    }
}
 

Playground