前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 基础之知识普及

Golang 基础之知识普及

原创
作者头像
帽儿山的枪手
发布2022-06-07 23:38:31
8650
发布2022-06-07 23:38:31
举报

大家好,今天将梳理出的 Go语言知识普及内容,分享给大家。 请多多指教,谢谢。

前面已将基础语法、数据类型、函数使用内容介绍完成,相信大家已经有了Go基础。此篇内容主要谈一下对Go这门语言的背景和特性内容,还有一些编程规范和大家分享一下。

本章节内容

  • Go语言的介绍
  • 编程规范

Go语言的介绍

Go语言是由谷歌公司在2007年开发的一门语言,目的是能在多核心时代高效编写网络应用程序。 Go语言的创始人 Robert Griesemer、Rob Pike 和 Ken Thompson都是在计算机发展过程中作出过重要贡献的人。 自从2009年11月正式公开发布后,Go语言迅速席卷了整个互联网后端开发领域,其社区里不断涌现出类似vitess、Docker、etcd、Consul等重量级的开源项目。

Go语言开发团队花了很长时间来解决当今软件开发人员面对的问题。 开发人员在为项目选择语言时,不得不在快速开发和性能之间作出选择。 C和C++这类语言提供了很快的执行速度,而Ruby和Python这类语言则擅长快速开发。 Go语言在这两者间架起了桥梁,不仅提供了高性能的语言,同时也让开发更快速。

特性
  • 语法简洁到只有几个关键字
  • 编译器速度非常快
  • 能显著减少等待项目构建的时间
  • 内置并发机制
  • 自带垃圾回收器

1. 开发速度

编译一个大型的C或者C++项目所花费的时间甚至比去喝杯咖啡的时间还长。

Go语言使用了更加智能的编译器,并简化了解决依赖的算法,最终提供了更快的编译速度。 编译Go程序时,编译器只会关注哪些直接被引用的库,而不是像Java、C和C++那样,要遍历依赖链中所有依赖的库。因此,很多Go程序可以在1秒内编译完。 在现代硬件上,编译整个Go语言源码树只需要20秒。

2. Runtime

Golang Runtime是go语言运行所需要的基础设施,主要作用:

  • 携程调度,内存分配,GC;
  • 操作系统及CPU相关的操作的封装(信号处理,系统调用,寄存器操作,原子操作等),CGO;
  • pprof,trace,race检测的支持;
  • Map,channel,string等内置类型及反射的实现

说明:

  1. 与Java,Python不同,Go并没有虚拟机的概念,Runtime也直接被编译成 native code;
  2. Go的Runtime与用户代码一起打包在一个可执行文件中;
  3. 用户代码与Runtime代码在执行的时候并没有明显的界限,都是函数调用;
  4. go对系统调用的指令进行了封装,不依赖于glibc;
  5. 一些Go的关键字被编译成runtime包下的函数

此部分内容参考 腾讯技术工程发布的Runtime文章 https://zhuanlan.zhihu.com/p/95056679

3. 内存管理

不当的内存管理会导致程序崩溃或者内存泄漏,甚至让整个操作系统崩溃。 Go语言拥有现代化的垃圾回收机制,可以有效的解决这个难题。核心的目的是把无趣的内存管理交给专业的编译器去做,而让程序员更专注与更有趣的事情。

适用的领域
  1. 服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
  2. 分布式系统,数据库代理器等。
  3. 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用。
  4. 内存数据库,前一段时间google开发的groupcache,couchbase的部分组建。
  5. 云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台。
  6. 游戏服务端的开发。

总体来说,所面临的业务要求高并发、性能要求强、处理敏捷等特性,都可以首先考虑用Go来做。

编程规范

命名规范

包命名

保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。包名应该为小写单词,不要使用下划线或者混合大小写。

文件命名

  • 尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。
  • 非单元测试文件不要以_test结尾,go编译器默认 x_test.go 为单元测试文件,不会进行编译。

变量命名

  • 采用驼峰法,通过首字母大小写来控制是否包外可见。
  • 特殊名词的首字母缩写需要按照规范来,例如 URLProxy 或者 urlProxy 不要命名为 UrlProxy。

接口命名

  • 单个函数的接口名以"er"作为后缀,例如 type Reader interface {…}
  • 两个函数的接口名综合两个函数名,例如 type WriteFlusher interface {…}
  • 三个以上函数的接口名,类似于结构体名,例如 type Car interface {…}
代码格式化

推荐使用gofmt, goimports

注释

多写关键函数的注释,活用 //TODO//FIXME

包引用
  • 包引入了三种类型的包:标准库包、程序内部包、第三方包,请按这种顺序每部分预留一行空行,较为清晰。
  • 在项目中不要使用相对路径引入包,使用绝对路径引入包
  • 不要使用 . 来省略包名引用
其他规范
  • receiver命名最多2个字母,不能使用 me 或者 self 或者 this,例如 func (c *Client) GetUserName() string
  • 每行代码长度最好不超过80个字符,如果超过建议换行
  • 函数返回值采用返回"指针"类型而不是返回"值"类型 (推荐)
  • 没十分必要不能panic,进程开始的处理函数可以panic
  • 任何一个goroutine都应该有recover来保护程序不会因为panic而crash,因为任何一个goroutine如果抛panic但没有recover整个程序会crash

参考材料

《Go语言实战》书籍

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本章节内容
  • Go语言的介绍
    • 特性
      • 适用的领域
      • 编程规范
        • 命名规范
          • 代码格式化
            • 注释
              • 包引用
                • 其他规范
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档