对于golang的逗号ok模式的应用整顿

/*@Time : 2019-02-23 11:49 @Author : Tenlu@File : ok@Software: GoLand*/package main import "fmt" // 逗号ok模式func main() {    useMap()    useChan()    userType()        useType2()} //1.检测map中是否含有指定keyfunc useMap() {    company := map[string]string{"polly": "tencent", "robin": "baidu", "jack": "alibaba", "tenlu": "itech8"}    if _, ok := company["toms"]; !ok {        fmt.Println("key toms is not exists")    }    for ck, cv := range company {        fmt.Println(ck + "->" + cv)    }} // 2. 检测chan是否敞开func useChan() {    ch := make(chan int, 10)    for i := 1; i <= 5; i++ {        ch <- i    }    close(ch) // chan赋值完结,必须敞开通道    elem := <-ch    fmt.Println(elem) // 1  // FIFO队列,先发送的chan肯定最先被接管     for cc := range ch {        fmt.Println(cc)    }        // ch <-8 // 此时再往ch这个chan里发送数据,就会报错,因为通道曾经敞开,panic:send on closed channel     elem2 := <-ch    elem3 := <-ch    fmt.Printf("elem2:%d\n", elem2) // 0,因为通道曾经敞开    fmt.Printf("elem3:%d\n", elem3) // 0    if _, isClosed := <-ch; !isClosed {        fmt.Println("channel closed")    }    // go是没有while循环的,此处相似其余语言的while(true)    for {        i, ok := <-ch        if !ok {            fmt.Println("channel closed!")            break        }        fmt.Println(i)    }} // 3.检测是否实现了接口类型type I interface {    // 有一个办法的接口 I    Get() Int} type Int int // Int 类型实现了 I 接口func (i Int) Get() Int {    return i} func userType() {    var myint Int = 5    var inter I = myint // 变量赋值给接口    val, ok := inter.(Int)    fmt.Printf("%v, %v\n", val, ok) // 输入为:5,true}func useType2()  {   // chan 类型的空值是 nil,申明后须要配合 make 后能力应用。   var ch=make(chan interface{},10)   ch<-10   ch<-"jack"   ch<-map[string]interface{}{"name":"jack","age":11}   close(ch) // 此处不close通道,遍历时则报错   fmt.Printf("%v\n",<- ch)   for c:=range ch {      fmt.Printf("for:%v\n",c)      fmt.Sprintf("type:%T\n", c)      if newValue,ok:=c.(map[string]interface{});ok{         fmt.Printf("type:%s\n",reflect.TypeOf(c)) // 获取变量类型         // map[string]interface {}         if _,ok:=newValue["name"];ok{            for k,v:=range newValue {               fmt.Printf("%v->%v,\n",k,v)            }         }      }   }   fmt.Printf("%v\n",<- ch) // nil}func useType2()  {   // chan 类型的空值是 nil,申明后须要配合 make 后能力应用。   var ch=make(chan interface{},10)   ch<-10   ch<-"jack"   ch<-map[string]interface{}{"name":"jack","age":11}    close(ch) // 此处不close通道,遍历时则报错   fmt.Printf("%v\n",<- ch)   for c:=range ch {      fmt.Printf("for:%v\n",c)       fmt.Sprintf("type:%T\n", c)      if newValue,ok:=c.(map[string]interface{});ok{         fmt.Printf("type:%s\n",reflect.TypeOf(c)) // 获取变量类型         // map[string]interface {}         if _,ok:=newValue["name"];ok{            for k,v:=range newValue {               fmt.Printf("%v->%v,\n",k,v)            }         }      }   }   fmt.Printf("%v\n",<- ch) // nil}