package main import ( "fmt" ) func main() { // 使用 make 创建 channel // 方式1 var intChan chan int intChan = make(chan int, 3) // 方式2 // intChan := make(chan int, 3) fmt.Printf("aChan的值:%v\n", intChan) // 0xc000086000 fmt.Printf("aChan本身的地址:%p\n", &intChan) // 0xc000080018 // 向管道发送值(注意给channel放入数据时,不能超过其容量) intChan <- 10 intChan <- 20 fmt.Printf("aChan的len:%v\n", len(intChan)) // 2 fmt.Printf("aChan的cap:%v\n", cap(intChan)) // 3 // 从管道中读取数据 int1 := <- intChan int2 := <- intChan fmt.Println(int1, int2) // 10 20 }
package main import ( "fmt" ) type Cat struct { Name string Age int } func main() { // 定义一个存放任意数据类型的管道3个数据 allChan := make(chan interface{}, 3) allChan <- 10 allChan <- "pd" cat := Cat{"tom", 10} allChan <- cat // 如果希望获得到管道中的第三个元素,则需先将前2个推出 <- allChan <- allChan newCat := <- allChan fmt.Printf("newCat=%T , newCat=%v\n", newCat, newCat) // fmt.Println(newCat.Name) // 编译不通过,错误 fmt.Println(newCat.(Cat).Name) // 使用类型断言,正确 }
channel 使用注意事项:
func main() { intChan := make(chan int, 3) intChan <- 10 intChan <- 20 // 关闭 channel close(intChan) // 关闭 channel 后,无法将数据写入到 channel 中,读取数据是可以的 num := <- intChan fmt.Println(num) // 10 }
channel 支持 for-range 的方式进行遍历:
package main import "fmt" func main() { ch := make(chan int, 3) ch <- 10 ch <- 20 ch <- 30 // 关闭 channel close(ch) // 遍历 channel for v := range ch { fmt.Println(v) } }
1
原文:https://www.cnblogs.com/believepd/p/10957377.html