So it always guarantees to print "hello world" for the unbuffered channel, doesn't it?
package main *var c = make(chan int)* var a string func f() { a = "hello, world" *c <- 0* } func main() { go f() *<-c* print(a) } it will guarantee to print "hello, world". package main *var c = make(chan int)* var a string func f() { a = "hello, world" *<-c* } func main() { go f() * c <- 0* print(a) } it will also guarantee to print "hello, world". A send on a channel happens before the corresponding receive from that channel completes. For the unbuffered channel and the buffered channel. *A receive from an unbuffered channel happens before the send on that channel completes.* Only for the unbuffered channel. 在 2014年5月29日星期四 UTC+8下午10:00:29,Ian Lance Taylor写道: > > On Thu, May 29, 2014 at 1:32 AM, liming <limi...@gmail.com <javascript:>> > wrote: > > > > From go’s documentation > > > > If the channel is unbuffered, the sender blocks until the receiver has > > received the value. If the channel has a buffer, the sender blocks only > > until the value has been copied to the buffer; if the buffer is full, > this > > means waiting until some receiver has retrieved a value. > > > > The following code is gaurantined to print “hello, world” > > > > package main > > var c = make(chan int, 10) > > var a string > > > > func f() { > > a = "hello, world" > > c <- 0 > > } > > > > func main() { > > go f() > > <-c > > print(a) > > } > > > Right. > > > > if we change channel c to unbuffered channel: > > > > package main > > var c = make(chan int) > > var a string > > > > func f() { > > a = "hello, world" > > c <- 0 > > } > > > > func main() { > > go f() > > <-c > > print(a) > > } > > > > Is it gaurantined to print “hello, world” > > Yes. > > > c<-0 will bock until <-c has received the value, > > so c<-0 happens before <-c, as the assignment to a happens before c<-0, > > so in the main function, it will print “hello, world” right? > > Right. > > > But from go memory model, it says > > A receive from an unbuffered channel happens before the send on that > channel > > completes. > > > > so print(a) in main function is not gaurantined to print “hello, world” > > No. The memory model also says "A send on a channel happens before > the corresponding receive from that channel completes." So the send > starts to happen, then the receive completes, then the send completes. > > Ian > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.