设为首页 加入收藏

TOP

golang 值得注意的地方(2则)
2017-09-30 13:47:35 】 浏览:6210
Tags:golang 值得 注意 地方

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/

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇golang-web框架revel一个表单提交.. 下一篇html5+go+websocket简单实例代码

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目