協程生産消息
//協程生産消息
//prefix : 産生的字元串字首
//ch : 通道
func producer_msg(prefix string, ch chan<- string) { //支援字元串格式通信的通道chan chan<-向通道寫資料
//循環産生消息
for {
ch <- fmt.Sprintf("協程生産消息: %s %v", prefix, ch) //将産生的消息寫入通道
time.Sleep(time.Second) //等待1秒
}
}
協程消費消息
//協程消費消息
func customer_msg(ch <-chan string) { //支援字元串格式通信的通道ch <-chan 讀取通道資料
//循環消費消息
for {
msg := <-ch //讀取通道資料并儲存到msg
fmt.Println("協程消費消息: " + msg) //輸出資料
}
}
ch := make(chan string) //建立資料通道
go producer_msg("cat", ch) //啟動一個協程生産cat資料
go producer_msg("dog", ch) //啟動一個協程生産dog資料
//消費上面兩個協程産生的資料
customer_msg(ch)
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: dog 0xc000082060
協程消費消息: 協程生産消息: cat 0xc000082060
package main //包名
//導入子產品
import (
"fmt" //格式化輸出
"reflect" //反射庫
//随機庫
"time" //時間日期庫
)
//接口定義
type Animal interface {
Speak() string //定義一個方法Speak傳回類型是字元串
}
//定義Dog結構
type Dog struct {
}
//定義Cat結構
type Cat struct {
}
//在結構Dog中實作接口方法
func (d Dog) Speak() string {
return "Dog Speak"
}
//在結構Cat中實作接口方法
func (c Cat) Speak() string {
return "Cat Speak"
}
//定義一個方法,傳入參數是interface{}的集合
func PrintAll(v []interface{}) {
//周遊對象
for _, r := range v {
fmt.Println(r) //輸出值
}
}
//反射測試
func CallAll(v []interface{}) {
for _, r := range v {
fmt.Println(reflect.TypeOf(r))
fmt.Println(reflect.TypeOf(r).Kind())
}
}
//協程生産消息
//prefix : 産生的字元串字首
//ch : 通道
func producer_msg(prefix string, ch chan<- string) { //支援字元串格式通信的通道chan chan<-向通道寫資料
//循環産生消息
for {
ch <- fmt.Sprintf("協程生産消息: %s %v", prefix, ch) //将産生的消息寫入通道
time.Sleep(time.Second) //等待1秒
}
}
//協程消費消息
func customer_msg(ch <-chan string) { //支援字元串格式通信的通道ch <-chan 讀取通道資料
//循環消費消息
for {
msg := <-ch //讀取通道資料并儲存到msg
fmt.Println("協程消費消息: " + msg) //輸出資料
}
}
//入口
func main() {
fmt.Println("hi,go")
animals := []Animal{Dog{}, Cat{}} //初始化集合
//周遊集合
for _, ani := range animals {
v := ani.Speak() //調用接口方法
fmt.Println(v) //輸出結果
}
//根據字元串資料生成[]interface{}
names := []string{"stanley", "david", "oscar"}
//生成指定長度的空接口對象集合
vals := make([]interface{}, len(names))
//周遊
for i, v := range names {
vals[i] = v //指派
}
//調用自定義函數
PrintAll(vals) //傳入[]interface{}對象
//轉換Dog和Cat結構為interface{}
anis := make([]interface{}, len(animals))
//anis[0] = animals[0].Speak()
//anis[1] = animals[1].Speak()
//周遊集合并給interface{}指派
for k, v := range animals {
anis[k] = "convert to interface{} : " + v.Speak()
out_kind_type := fmt.Sprintf("Speak: 類型-> %v 種類-> %v", reflect.TypeOf(v.Speak), reflect.TypeOf(v.Speak).Kind())
fmt.Println(out_kind_type)
}
//調用自定義函數輸出
PrintAll(anis) //
for k, v := range animals {
anis[k] = v
}
CallAll(anis) //
fmt.Println("class name: " + reflect.TypeOf(Cat{}).Name())
ch := make(chan string) //建立資料通道
go producer_msg("cat", ch) //啟動一個協程生産cat資料
go producer_msg("dog", ch) //啟動一個協程生産dog資料
//消費上面兩個協程産生的資料
customer_msg(ch)
}