学习Go的一些需要注意的知识点。
七、数组
1、数组申明:var identifier [len]type ; arr := […]string{“aa”,”bb”,”cc”,”dd”}
2、使用for、for-range循环打印数组, for k,v := range arr {} ; for i := 0; i < len(arr); i++ {}
3、数组和切片的区别。参考:GO中数组与切片的区别
4、终止索引标识的项不包括在切片内
八、map
1、map的声明
- var identifier map [keyType] valueType
- var identifier = make(map [keyType] valueType)
- identifier := make(map [keyType] valueType)
2、valueType的形式多样。出了string、int,还可以包括[4]int、[]int、func() int 、map [keyType] valueType等。
3、数组、切片、map,这三种类型中,map的性能是最低的,读取的性能比例大概是 1 : 1.5 : 25
4、注意:map 默认是无序的,不是按照 key 的顺序排列的,也不是按照 value 的序排列的。每次刷新后,排序会发生变化。
5、使用val1, isPresent = map1[key1] 方法,来判断key1是否存在?
6、map的排序、key和值互换的方法。
九、包
1、math/big,可以对大的整数进行运算,但性能极其低下。
2、参考:Go中import 导入包的语法
十、结构体 struct
1、结构体的定义的语法:
type identifier struct { field1 type1 field2 type2 ... }
2、结构的声明两种方式:
第一种: var t *T t = new(T) 也可以直接写成: t := new(T) 第二种: var t T
注意这2种的区别,第一种方式:变量 t 是一个指向 T的指针,此时结构体字段的值是它们所属类型的零值。
声明 var t T 也会给 t 分配内存,并零值化内存,但是这个时候 t 是类型T。在这两种方式中,t 通常被称做类型 T 的一个实例(instance)或对象(object)。
无论变量t是一个结构体类型还是一个结构体类型指针,都使用同样的 选择器符(selector-notation) 来引用结构体的字段:
type myStruct struct { i int } var v myStruct // v是结构体类型变量 var p *myStruct // p是指向一个结构体类型变量的指针 v.i p.i
3、结构体初始化
type struct1 struct { i1 int f1 float32 str string }
- ms := &struct1{10, 15.5, “Chris”}
- ms := struct1{10, 15.5, “Chris”}
4、结构体中的方法
十一、接口
1、接口定义格式
type Namer interface { Method1(param_list) return_type Method2(param_list) return_type ... }
2、接口命名的方式
接口的名字由方法名加 [e]r 后缀组成,例如 Printer、Reader、Writer、Logger、Converter 等等。还有一些不常用的方式(当后缀 er 不合适时),比如 Recoverable,此时接口名以 able 结尾,或者以 I 开头(像 .NET 或 Java 中那样)。
Go 语言中的接口都很简短,通常它们会包含 0 个、最多 3 个方法。
3、接口类型的判断:type-switch
switch t := o.(type) { case *stockPostion: fmt.Printf("Type Square %T with value %v\n", t, t) case *car: fmt.Printf("Type Circle %T with value %v\n", t, t) case nil: fmt.Printf("nil value: nothing to check?\n") default: fmt.Printf("Unexpected type %T\n", t) }
4、在接口上调用方法时,必须有和方法定义时相同的接收者类型或者是可以从具体类型 P 直接可以辨识的:
- 指针方法可以通过指针调用
- 值方法可以通过值调用
- 接收者是值的方法可以通过指针调用,因为指针会首先被解引用
- 接收者是指针的方法不可以通过值调用,因为存储在接口中的值没有地址
将一个值赋值给一个接口时,编译器会确保所有可能的接口方法都可以在此值上被调用,因此不正确的赋值在编译期就会失败。
译注:Go 语言规范定义了接口方法集的调用规则:
- 类型 *T 的可调用方法集包含接受者为 *T 或 T 的所有方法集
- 类型 T 的可调用方法集包含接受者为 T 的所有方法
- 类型 T 的可调用方法集不包含接受者为 *T 的方法