golang 值得注意的地方(2则)
2016-05-21 10:06
405 查看
golang 的语法和使用方式都非常简单明了,没有花哨的语法糖,也没有多余的关键字。
但是即使是这么简洁的语言,仍然有一些不那么直白,需要注意的地方,比如下面2点。
interface 由2部分组成, type 和 value ,调用 func f 的时候,out 的 type 设置为 *bytes.Buffer, value 设置为 nil。
此时 out != nil,因为虽然 out 的
在写代码时如果不注意这里,很容易导致运行时的 panic
类型判断时,转型的代码可以返回一个值,也可以返回2个值(附加判断结果 ok)。
同一段代码的返回值,却有2种情况,channel和map也有上面的现象:(如以下代码都是正确的)
这种语法的实现简单来说,就是 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/
但是即使是这么简洁的语言,仍然有一些不那么直白,需要注意的地方,比如下面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部分组成, type 和 value ,调用 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/
相关文章推荐
- django--的第一个项目hello world
- Google 知道你点击了哪个网页
- Google 知道你点击了哪个网页
- go 学习笔记 - sublime text 环境配置
- ubuntu 安装go语言开发环境
- 泸州气gou
- 在Django中使用markdown
- 啦啦啦啦~Django1.96---编写第一个Django应用(6)
- Google I/O大会,炫酷产品汇总
- Algorithm-How To Identifying Same IMG
- 初探:celery在django下的应用.md
- 啦啦啦啦~Django1.96---编写第一个Django应用(5)
- django ajax 应用实例
- hdu5318 The Goddess Of The Moon【矩阵快速幂】
- 利用googleZxing生成二维码识别二维码
- django 中cookies和session的用法
- Django 学习小组:博客开发实战第一周教程 —— 编写博客的 Model 与首页面
- golang: beego自动化部署
- osgOcean+VS2010+Win7编译方法
- osgOcean 水面效果