语法基础
变量、常量
const var = 1
const (
var = 1
)
字符串
- Go语言字符串为任意字节常量序列
- UTF-8编码,变宽字符序列。而Java的String、C++的std::strin都是定宽的
- 可使用 ==、!=、>=、<=、>、<比较字符串,底层会在内存中逐字节比较字符串
- 可直接转成
[]rune
,unicode
切片(rune是int32的别名) 可使用 ` 和 ” 创建
双引号创建可解析字符串,支持转义序列,不支持多行
反引号创建原生字符串,不支持转义序列,支持多行,可包含除了反引号之外的任意字符可使用 for range循环
for idx, rune range str {
....
}
- Go语言字符串底层就是增强型的
[]byte
,所以[]byte(string) string([]byte)
只需要O(1),无需复制 - 对于只包含7位ASCII字符的字符串,可以直接用
string[idx]
索引字符;而对于包含非ASCII字符的字符串,需要转换成[]rune(string)
再索引 strings.IndexFunc(string, indexFunc)
可使用自定义方法查询index,如unicode.IsSpace
来查询任意空白符的位置strings.FieldsFunc(string, func(rune) bool)
遍历string中rune,如果匿名函数返回true则进行拆分
集合类型
值、指针和引用类型
- 指针
- Go指针类似C、C++,区别是不能参与指针计算
- Go不需要显示free内存,本身具备垃圾回收器
- 对布尔、数值、字符串类型,传递给方法和函数时使用了值传递,且无论字符串长度如何,代价都很小。但是如果函数内部修改了字符串,那么将会生成一份副本,这个代价可能比较大
- new() 函数返回的是指针 同 取址操作符 &
type test struct {
id int64
}
hello := new(test)
hello.id = 2
- Go支持大括号直接初始化对象
Go语言的 . 操作符,会直接解引用指针,无需再显示使用 * 解引用
- 引用类型
- 映射、切片、通道、函数、方法都是引用类型
数组
- 长度固定,不可修改
- 声明与初始化(未被显示初始化的元素,值会初始化位0值)
[length]Type
[N]Type{value1, value2, ...}
[...]Type{value1, value2, ...}
切片
- 创建,二三四长度等于容量
make([]Type, length, capacity)
make([]Type, length)
[]Type{}
[]Type{value1, value2, ...}
- 切片的重新切片 与 原切片都是对同一个底层数组的引用
- for range循环中,直接修改range参数中的当前元素,会包 ineffectual assignment错误。
for _, amount := range amounts {
amount = amount * 2
}
正确修改方式如下
for i := range amounts {
amounts[i] xxxxx
}
- append函数 返回新切片(…代表 将切片元素全部取出转成数组)
append(slice1, slice2[idx:]...)
映射
- 键唯一,且必须支持 == 与 != 操作
- 基本类型、可比较的数组、结构体以及基于这些类型的自定义类型都可以作为键
- 创建方式
make(map[KeyType] ValueType, initialCapacity)
make(map[KeyType] ValueType)
map[KeyType] ValueType{}
map[KeyType] ValueType{key1: value1, ...}
- 支持for range遍历
- 查询,可以通过判断found来知晓是否存在键,但通过值无法判断,因为不存在就返回零值
value, bFound := map[key]
- 删除
d