写点什么

Go 语言的设计哲学

发布于: 刚刚

简单

显示

组合

并发

面向工程

  • 简单

  • Go 语言特点

  • 仅有 25 关键字,主流语言最少

  • 内置垃圾回收,降低开发人员内存管理的心智负担

  • 首字母大小写决定可见性,无需通过额外的关键字

  • 变量初始化类型零值,避免随机数作为初值的问题

  • 内置并发支持,简化并发程序设计

  • 内置接口类型,为组合的设置哲学奠定基础

  • 原生提供完善的工具链,开箱即用

  • 总结

  • 保证语言简单,简单通常意味可读性好以及维护性和可靠性好

  • 显示

  • 简单来说明确变量之间比较必须类型一致,不一致需要手动转换

  • Go 语言错误处理的形态是采用的显示基于值比较的错误处理方案,必须使用 return 显示返回

  • 但是最新版本 Go1.18 正式支持泛型

  • 组合

  • Go 语言无类型层次体系,各类型之间相互独立,没有子类型的概念

  • 每个类型都可以有自己的方法集合,类型定义与方法实现正交独立的

  • 实现某个接口,无需特定关键字修饰

  • 包之间相对独立,没有子包的概念

  • 垂直组合

  • Go 语言支持类型嵌套,以此实现新类型,满足设计要求,新类型和被嵌套的类型两种之间无任何关系,新类型实例的调用方法时,只跟方法的名字有关,即通过类型嵌套,快速让一个新的类型"复用"其他类型已经实现能力,


    // $GOROOT/src/io/io.go    type ReadWriter interface {        Reader        Writer    }
复制代码


  • 水平组合

  • 使用接口来实现

  • 接口是方法集合,通常接受接口类型参数的普通函数进行组合


    #函数ReadAll通过io.Reader接口水平组合,实现数据读取    // $GOROOT/src/io/ioutil/ioutil.go    func ReadAll(r io.Reader)([]byte, error)
// $GOROOT/src/io/io.go func Copy(dst Writer, src Reader)(written int64, err error)
复制代码


  • goroutine + channel 实现类似 unix pipe 能力

  • 总结

  • 组合原则实质塑造 Go 程序骨架,类型嵌入提供了垂直扩展能力,接口是水平组合关键

  • 并发

  • 原生支持并发,采用用户层轻量线程 goroutine,占用资源比较小,代价低

  • 内置 channel 用于传递消息和实现同步,并通过 select 实现多路 channel 并发控制

  • 面向工程

  • Go 编译速度快

  • 去除依赖包

  • 导入不使用无法编译,解析

  • 不支持默认函数参数,增加代码清晰度和可读性

  • 增加类型别名 ,支持大规模代码库重构


参考资料

https://time.geekbang.org/column/article/426740

用户头像

努力的人,一般运气不会太差 2018.12.28 加入

还未添加个人简介

评论

发布
暂无评论
Go语言的设计哲学