天天看點

golang協程生産消息與消費消息

 協程生産消息

//協程生産消息
//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)
}