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

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

package mainimport ("bytes""fmt""io"
)func main() {var b *bytes.Bufferif 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 mainimport ("fmt""io""os"
)func main() {var w io.Writerw = os.Stdoutrw, 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/

本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/p/5507947.html,如需转载请自行联系原作者

golang 值得注意的地方(2则)相关推荐

  1. axios拦截器_78.1K 的 Axios 项目有哪些值得借鉴的地方

    Axios 是一个基于 Promise 的 HTTP 客户端,同时支持浏览器和 Node.js 环境.它是一个优秀的 HTTP 客户端,被广泛地应用在大量的 Web 项目中. 由上图可知,Axios ...

  2. 关于Socket和IOCP的一些值得注意的地方

    关于Socket和IOCP的一些值得注意的地方 IOCP是一整套高性能的IO操作异步模型,可以用在文件操作也可以用在网络SOCKET操作上面.当用在网络SOCKET上时,在服务器端主要配合Aceept ...

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

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

  4. 任何人都有值得学习的地方,横瓜向[水牛党](4618415)请教问题

    虽然不知道水牛党是谁,但任何人都有值得学习的地方.做人就要多学习. 横瓜(601069289)22:13:32 大神有什么指教? 横瓜(601069289)22:13:38 [水牛党]?(461841 ...

  5. Kotlin 1.4 和未来值得期待的地方

    对于企业来说,目前的Android开发面临着许多挑战,尤其是选择哪种技术用于开发最好的Android应用程序. Kotlin和Java是用于Android应用程序开发的两种编程语言,即使是有技术背景的 ...

  6. 任何值得去的地方,都没有捷径。

    任何值得去的地方,都没有捷径:任何值得等待的人,都会迟来一些: 任何值得追逐的梦想,都必须在一路艰辛中备受嘲笑. 所以,不要怕,不要担心你所追逐的有可能是错的. 因为,不被嘲笑的梦想不是梦想. The ...

  7. 华为p50预计售价鸿蒙是什么,华为P50没赶上首发鸿蒙系统,还有哪些值得期待的地方?...

    摘要:按照以往惯例,华为P系列新机会在4月发布,华为P50系列首发预装鸿蒙OS也是顺理成章的事.然而,令人意外的是,由于华为P50系列的发布延期,首发内置搭载鸿蒙系统的手机竟然不是华为最新旗舰P50系 ...

  8. MSDN值得学习的地方

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

  9. [分享] 网页设计者值得一去的地方

    一.网页设计类 ------------------------------- 1.网站名称:蓝色理想 网站地址: http://www.blueidea.com/ 简介: 哈哈,这个不用说了. -- ...

最新文章

  1. bean ref的bean可以做判断吗_Spring Boot @Condition 注解,组合条件你知道吗
  2. Linux下MySQL链接被防火墙阻止
  3. 【PC工具】更新在线流程图绘制工具bullmind,免费云存储流程图绘制,可直接粘贴图片...
  4. SAP UI5 dialog style max-height
  5. Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
  6. A. Red and Blue Beans
  7. 了解mysql processlist_哪些MySQL processlist状态要引起关注
  8. Go语言之interface详解
  9. 用树莓派打造家庭影院媒体库+硬盘播放机+无人值守下载机
  10. MeeGo系统Atom处理器 神秘设备现身俄罗斯
  11. K8S部署机器学习平台
  12. 卡斯特:中国是一个全球化的大试验
  13. GridView数据库分页+自定义分页导航(二):自定义分页导航。首页、上一页、下一页、尾页和跳转
  14. MFC中TeeChart插件绘图
  15. 2019年研究生数学建模E题加拿大站点数据批量下载
  16. euler欧拉系统尝试用yum、源码安装pacemaker失败
  17. 浪涌保护器+电涌保护器+SPD的选用指南
  18. linux 显卡扩展坞,雷蛇发布全新显卡扩展坞:拥有 700W 电源,还能免工具快速安装...
  19. 计算机中dte的中文含义,DCE和DTE含义
  20. 尔宾团队角色(Belbin Team Roles),亦被称为贝尔宾团队角色表(Belbin Team Inventory)...

热门文章

  1. 零距离感受2015年安全***大赛:静动之美 ***兼备
  2. linux zip 命令详解
  3. 谁干的mysql无密码登录?
  4. c# 正则过滤非中文字符
  5. SqlServer表死锁的解决方法
  6. Microsoft office Communications server 2007部署
  7. 微软是如何输掉API之战(下)
  8. 第一个django项目-通过命令行和pycharm两种方式
  9. debian9升级安装到python3.6和pip3.6
  10. 前端使用vue-i18n做中英文翻译