1.channel的特點
- 類似Unix中的管道(pipe)
- 先進先出,類似隊列
- 線程安全,多個goroutine同時訪問,不需要加鎖
- channel是有類型的,一個整數的channel只能存放整數
- 多個goroutine之間通過channel進行通信
- 支持任何類型
- channel在使用之前必須先進行初始化
2.channel的聲明
-
int類型的聲明
var intchan chan int intchan = make[chan int,10] intchan<-10
-
map類型的聲明
var mapchan chan map[string]string mapchan = make(chan map[string]string, 10) m := make(map[string]string, 16) m["stu01"] = "001" m["stu02"] = "002" mapchan <- m
-
struct類型的聲明
type student struct { name string } func main(){ var stuChan chan student stuChan = make(chan student, 10) stu := student{name: "stu01"} stuChan <- stu }
-
interface類型的聲明
var stuChan chan interface{} stuChan = make(chan interface{}, 10) stu := student{name: "stu01"} //在stuchan中寫入指針類型的stu stuChan <- &stu var stu01 interface{} //讀取stuchan中的內容 stu01 = <-stuChan fmt.Println(stu01)
輸出結果:
&{stu01}
-
interface類型轉成struct類型
type student struct { name string } func main(){ var stuChan chan interface{} stuChan = make(chan interface{}, 10) stu := student{name: "stu01"} stuChan <- &stu var stu01 interface{} stu01 = <-stuChan //將interface轉成具體的類型 var stu02 *student //推薦:使用OK判斷是否轉成功,否則如果不是轉的類型,程序容易崩 stu02, ok := stu01.(*student) if !ok { fmt.Println("can not convert") return } fmt.Println(stu02) }
輸出結果:
&{stu01}