Golang 入门基础(三) - 内置数据类型(上)
指针类型
定义指针
1 | var a int = 10 |
空指针
- 默认值,空指针的值为
nil
。
访问指针
- 使用
*ptr
访问值,地址无法访问将产生运行错误。 - 结构体使用
name.attr
访问元素,在Golang
中可以使用ptr.attr
通过指针访问元素(Clang
是ptr->attr
)。
结构体类型
定义结构体
- 具名结构体
1 | type Book struct { |
- 字段匿名
1 | type Book struct { |
- 结构体匿名
1 | var a = struct{ |
- 两种匿名不可同时使用。
访问结构体
1 | var a Book = Book{"Golang 入门经典", "Unknown"} |
类型转换
- 如果两个结构体具有完全相同的定义,它们可以进行显式类型转换。
嵌套与继承
- 结构体嵌套将一个结构体作为新结构体的一个字段。
1 | type Library struct { |
- 结构体继承将一个结构体的字段和方法引入新结构体。结构体的方法后面会提及。
1 | type ChildBook struct { |
数组类型
定义数组
1 | var a [3]int |
传递数组
Golang
中数组名表示整个数组。这与Clang
表示数组头指针不同,但与其std::array
类似。传递数组有时会产生很大的开销,可以使用指针数组。
1 | var a [3]int = [3]int{1, 2, 3} |
切片类型
定义切片
1 | var a []int // [], 注意 [3]int / [...]int 都是数组不是切片 |
切片原型
slice
是引用数据类型,对切片的赋值不会拷贝数据,切片的切片也是引用而非拷贝。- 后面介绍的所有切片操作请注意区别 引用与拷贝
1 | type SliceHeader struct { |
切片操作
切片
-
切片是一种数据类型也是一种操作
-
进行切片的对象可以是数组或切片,将返回
SliceHeader
,是对数据的引用而非拷贝。 -
Golang
中的切片应与Python
区分的是:Golang
中索引不可使用负数表示,并且不可设置步长。
1 | var a = []int{1, 2, 3} |
append() 与 copy()
append()
与copy()
都是对数据的拷贝,会对引用到的所有数据进行拷贝。
1 | var a = []int{1, 2} |
Golang
中args...
表示解包,对应Python
中的*args
。
常见组合操作
拷贝切片
1 | b := append([]int{}, a...) |
1 | b := make([]int, len(a)) |
原地删除
- 原地删除首部
1 | a = a[st:] // 删除前 st 个元素 |
- 原地删除尾部
1 | a = a[:ed] // 保留前 ed 个元素 |
- 原地截取中部
1 | a = a[st:ed] // 截取索引 [st, ed) 元素 |
- 原地删除中部
1 | a = append(a[:st], a[ed:]...) // 删除索引 [st, ed) 元素 |
原地插入
- 原地末尾追加
1 | a = append(a, b...) |
- 原地首部插入
1 | a = append(b, a...) |
- 原地中间插入
1 | a = append(append(a[:st], b...), a[st:]...) // 从第 st 个元素开始插入元素 |
字符串类型
定义字符串
- 在
Golang
字符串默认使用UTF-8
编码。
1 | var a string = "Hello World!" |
字符串原型
- 字符串是引用数据类型,底层使用
[...]byte
存储,而使用UTF-8
解析。与Java
相似字符串作常量使用,不直接修改其值。
1 | type StringHeader struct { |
字符串操作
- 许多字符串操作位于库文件
strings
中,许多字符串类型转换位于库文件strconv
中。 - 这里假设已经定义了两个变量:
1 | var a = "你好" |
字符串切片
- 字符串可以认为是一个静态切片类型,可以进行相应的切片操作。不可使用
append
和copy
函数。
字符串拼接
1 | c := a + b // 运算符 两字符串拼接 |
1 | c = strings.Join([]string{a, b}, "") // 函数 多字符串拼接 |
1 | // 官方推荐的 最高效率 |
字符串编码
1 | c := []byte(a) // 转换为 ASCII 编码, 一个 Unicode 字符占用 3 Bytes |
1 | c := []rune(a) // 转换为 UTF-8 编码 |
- 对
string
类型直接使用len()
,返回值为ASCII
编码长度。
其他操作
1 | func strings.Contains(s string, substr string) bool // s 是否包含 substr |
1 | func strings.ToLower(s string) string // 返回 s 的小写形式 |
1 | func strings.Split(s string, sep string) []string // 以 sep 分割字符串 s |
1 | func strings.Join(elem []string, sep string) string // 以 sep 衔接 elem 中元素, Split 的逆过程 |
1 | func strings.Replace(s string, old string, new string, n int) string |
1 | func string.Repeat(s string, n int) string // s 重复 n 次 |
1 | func strings.TrimSpace(s string) string // 去除前后空字符 |
字符串转换
转换为字符串类型
1 | func fmt.Sprint(a ...any) string // 将任意类型转换为字符串, 只要类型满足 fmt.Stringer 接口 |
转换自字符串类型
1 | func strconv.ParseBool(s string) (bool, error) |
评论