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 值得注意的地方(2则)的更多相关文章

  1. [转] shared_from_this 几个值得注意的地方

    http://hi.baidu.com/cpuramdisk/item/7c2f8d77385e0f29d7a89cf0 shared_from_this()是enable_shared_from_t ...

  2. Shared_from_this 几个值得注意的地方

    shared_from_this()是enable_shared_from_this<T>的成员 函数,返回shared_ptr<T>.首先需要注意的是,这个函数仅在share ...

  3. 關於Validform 控件 值得注意的地方

    Validform控件其實用起來挺方便的,直接百度就能找到官網,有直接的demo做參考.這些我就不提了,我所要說的是關於Validform控件的ajax的提交. Validform中有個參數ajaxP ...

  4. MSDN值得学习的地方

    作者:朱金灿 来源:http://blog.csdn.net/clever101 我一直认为:如果你没有乔布斯那样的天才,能够从头脑中原创出好产品,那么最好先学习分析好的产品,它到底好在哪里?哪些地方 ...

  5. 国内各大安卓(Android)市场的上传方式、认领、通过审核有哪些不同,有什么值得注意的地方?

    6 个回答 赞同89反对,不会显示你的姓名 唐元鹏,扯淡爱好者 Jc droid.李明亮.知乎用户 等人赞同 作为一个android菜鸟开发者,代码水平不咋样,却练就了一身上传app的本领,大体说一下 ...

  6. SQL指令中一些特别值得注意的地方

    SQL基本指令要频繁使用,要是理解错了,将来工作一定会出现很大的麻烦.今天再重新梳理一下基本的SQL语法 SQL指令 in: 这个指令,我曾经发生过把它和python中的in搞混的错误.python中 ...

  7. Android EditText的使用及值得注意的地方

    Android上有很多输入法应用,每种输入法都有各自的特点,输入法多数时候是和EditText配合使用,结合我自己的亲身实践分享一下使用EditText过程中遇到的一些问题及解决方法. 设置默认输入法 ...

  8. Android笔记(三):View一些值得注意的地方

    Button android:textAllCaps="false" // Button上的英文字符不转成大写 EditText android:maxLines="2& ...

  9. 关于div+css布局值得注意的地方

    注意项 我们知道,如果想要两个 div(即块级元素)挨着一起排列,可以将其设置为inline-block(行内-块元素). 不过要注意两个div内的内容的对齐方式将是垂直中间对齐,所以这时候就需要使用 ...

随机推荐

  1. 移动端自动化环境搭建-JDK的安装

    一.安装jdk A.安装依赖 JDK作为JAVA开发的环境,不管是做JAVA开发的学生,还是做安卓开发的同学,都必须在电脑上安装JDK. B.安装过程 安装JDK 选择安装目录 安装过程中会出现两次 ...

  2. TCheckListBox

    TCheckListBox.CheckListBox http://www.cnblogs.com/mingdep/archive/2012/03/20/2408282.html 全部打勾 for ( ...

  3. HttpUtility.UrlEncode

  4. singleTask, singleInstance使用心得

    1. singleTask, singleInstance 共同点: 1)  一旦入栈,都为于栈底. 2) 全栈有且只有一个activity实例对象. 2. singleTask, singleIns ...

  5. Maven学习总结(二)——Maven项目构建过程练习

    上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立M ...

  6. arpg网页游戏之地图(二)

    [转]http://www.cnblogs.com/BlueWoods/p/4684557.html 这一节说说视窗,这个视窗,也就是游戏的视角.现在的网页游戏分为2D游戏,2.5D游戏和3D游戏,2 ...

  7. C++之jsoncpp学习

    最新由于客户端要用到jsoncpp,所以自己也跟着项目的需求学了一下jsoncpp.以前没用过xml,但是感觉接触json后,还蛮好用的. 参考地址 http://jsoncpp.sourceforg ...

  8. CSS 概念 Block Inline Containing block

    Block 元素 包括 "block-level box," "block container box," and "block box" ...

  9. c++学习笔记——字面值常量类

    字面值常量类:数据成员都是字面值类型的聚合类是字面值常量类.如果一个类不是聚合类,但是它符合一下要求,则它也是个字面值常量类: 1.数据成员都必须是字面值类型. 2.类必须至少含有一个constexp ...

  10. HTML标签CSS默认值研究

    最近写css的时候,发现在div元素里面添加ul元素后发现,ul列表在div里面距离最上方总是有一段空行,当时很奇怪,以为是哪个css出了问题,就把css去掉了,发现问题依旧,然后就查了一下发现htm ...