zoukankan      html  css  js  c++  java
  • golang 值得注意的地方(2则)

    golang 的语法和使用方式都非常简单明了,没有花哨的语法糖,也没有多余的关键字。
    但是即使是这么简洁的语言,仍然有一些不那么直白,需要注意的地方,比如下面2点。

    interface 赋值 nil Pointer 之后,变成 non-nil

    package main
    
    import (
      "bytes"
      "fmt"
      "io"
    )
    
    func main() {
      var b *bytes.Buffer
      if b == nil {
        fmt.Println("b is nil")
      }
      f(b)
    }
    
    func f(out io.Writer) {
    
      if out == nil {
        fmt.Println("nil")
      } else {
        fmt.Println("no-nil")
        // out.Write([]byte("xxxx"))  // there will cause panic
      }
    }
    

    interface 由2部分组成, typevalue ,调用 func f 的时候,out 的 type 设置为 *bytes.Buffer, value 设置为 nil。
    此时 out != nil,因为虽然 out 的 value == nil, 但是 type !=nil
    在写代码时如果不注意这里,很容易导致运行时的 panic

    类型判断的返回值有 2 种

    golang 中可以通过类型判断来进行转型。
    类型判断时,转型的代码可以返回一个值,也可以返回2个值(附加判断结果 ok)。

    package main
    
    import (
      "fmt"
      "io"
      "os"
    )
    
    func main() {
      var w io.Writer
      w = os.Stdout
    
      rw, ok := w.(*os.File)       // 可以正常执行
      // rw := w.(*os.File)        // 也可以正常执行
      fmt.Println(rw, ok)
    }
    

    同一段代码的返回值,却有2种情况,channel和map也有上面的现象:(如以下代码都是正确的)

    var val = map["key"]
    var val, ok = map["key"]
    
    var val = <- ch
    var val, ok = <- ch
    

    这种语法的实现简单来说,就是 golang 在类型判断时,会根据语法树检查 = 左边是否有 comma(也就是逗号),如果有的话就返回2个值,没有就返回一个值。
    具体可以参考:http://stackoverflow.com/questions/30129206/golang-return-multiple-values-issue/30135334

    blog 来源:http://blog.iotalabs.io/golang-zhi-de-zhu-yi-de-di-fang-2ze/

  • 相关阅读:
    贝叶斯分类
    K-Means算法
    python数组
    深度学习与神经网络
    数据挖掘算法之-关联规则挖掘(Association Rule)
    k8s记录-pip源配置
    k8s记录-yum本地仓库部署
    k8s记录-不同集群服务互联
    k8s记录-kube-dns(core-dns)配置(七)
    k8s记录-kubectl常用
  • 原文地址:https://www.cnblogs.com/wang_yb/p/5507947.html
Copyright © 2011-2022 走看看