Go 基础知识点
2019-1-31
| 2023-7-17
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
已经专职做了很久的 Python 开发,不过心中对当初带我入行 C 也一直有些留恋。Go 语言的设计和定位和 C 语言有很多共同之处,也融入了很多现代的设计理念,写起来很有当初写 C 的亲切感。准备好好学习下这门语言,这里记录下一些个人觉得重要的基础知识点,随着不断深入再补充。

基础语法

数组常量

如果数组值已经提前知道了,那么可以通过 数组常量 的方法来初始化数组。

new()make() 的区别

看起来二者没有什么区别,都在上分配内存,但是它们的行为不同,适用于不同的类型。
  • new(T) 为每个新的类型 T 分配一片内存,初始化为 0 并且返回类型为 *T 的内存地址:这种方法返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组结构体;它相当于 &T{}
  • make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片mapchannel
换言之,new 函数分配内存,make 函数初始化;下图给出了区别:
notion image
在的第一幅图中,代码为 var p *[]int = new([]int) 或者 p := new([]int) 。在第二幅图中,代码为 p := make([]int, 0),切片已经被初始化,但是指向一个空的数组。
以上两种方式实用性都不高。在实际开发中应采用下面的方法:
或者
这样分配一个有 50 个 int 值的数组,并且创建了一个长度为 10,容量为 50 的 切片 v,该 切片 指向数组的前 10 个元素。

开发规范

package 命名

  1. go不要求package的名称和所在目录名相同,但是你最好保持相同,否则容易引起歧义。因为引入包的时候,go会使用子目录名作为包的路径,而你在代码中真正使用时,却要使用你package的名称。
  1. 每个子目录中只能存在一个package,否则编译时会报错。

指针和值的使用

  • 推荐在实例方法上使用指针(前提是这个类型不是一个自定义的 map 、slice 等引用类型)
  • 当结构体较大的时候使用指针会更高效
  • 如果要修改结构内部的数据或状态必须使用指针
  • 当结构类型包含 sync.Mutex 或者同步这种字段时,必须使用指针以避免成员拷贝
  • 如果你不知道该不该使用指针,使用指针!
“结构较大” 到底多大才算大可能需要自己或团队衡量,如超过 5 个字段或者根据结构体内占用来计算。

参考资料

Golang
  • Golang 基础
  • 使用持续集成系统解放生产力全能型 uWSGI 配置
    目录