您的位置:首页 > 编程语言 > Go语言

golang 值得注意的地方(2则)

2016-05-21 10:06 405 查看
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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: