golang学习笔记

golang 学习笔记整理

数组

  • go 语言中数组是值类型,这意味着当数组赋值给一个新的变量时,该变量会得到一个原始数组的一个副本。如果对新变量进行更改,则不会影响原始数组。
  • 当数组作为参数传递给函数时,它们是按值传递,而原始数组保持不变。

引用类型

在 golang 中只有三种引用类型它们分别是切片 slice、字典 map、管道 channel。其它的全部是值类型,引用类型可以简单的理解为指针类型,它们都是通过 make 完成初始化

rune

Rune 是 int32 的别名。用 UTF-8 进行编码。这个类型在什么时候使用呢?例如需要遍历字符串中的字符。可以循环每个字节(仅在使用 US ASCII 编码字符串时与字符等价,而它们在 Go 中不存在!)。因此为了获得实际的字符,需要使用 rune 类型。

在 UTF-8 世界的字符有时被称作 runes。通常,当人们讨论字符时,多数是指 8 位字符。UTF-8 字符可能会有 32 位,称作 rune

指针

Go 有指针,但是没有指针运算。不能用指针变量遍历字符串的各个字节。因此它们更象是引用而不是你所知道的来自于 C 的指针。指针非常有用。

内存分配

Go 有两个内存分配原语,new 和 make。它们应用于不同的类型,做不同的工作,可能有些迷惑人,但是规则很简单。

用 new 分配内存

内建函数 new 本质上说跟其他语言中的同名函数功能一样:new(T)分配了零值填充的 T 类型的内存空间,并且返回其地址,一个*T 类型的值。用 Go 的术语说,它返回了一个指针,指向新分配的类型的零值。有一点非常重要:new 返回指针。

这意味着使用者可以用 new 创建一个数据结构的实例并且可以直接工作。

用 make 分配内存

回到内存分配。内建函数 make(T,args)与 new(T)有着不同的功能。它只能创建 slice,map 和 channel,并且返回一个有初始值(非零)的 T 类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。

make 返回初始化后的(非零)值。

务必记得 make 仅适用于 map,slice 和 channel,并且返回的不是指针。应当用 new 获得特定的指针。

new(T)返回*T 指向一个零值 T

make(T)返回初始化后的 T

转换

有时需要将一个类型转换为另一个类型。在 Go 中可以做到,不过有一些规则。首先,将一个值转换为另一个是由操作符(看起来像函数:byte())完成的,并且不是所有的转换都是允许的。

定义自己的类型

Go 允许定义新的类型,通过保留字 type 实现

1
type foo int

创建了一个新的类型 foo 作用跟 int 一样。创建更加复杂的类型需要用到 struct 保留字。