指针
- Go语言中只有值传递。
- 切片、映射、通道、函数等引用类型也是值传递,只不过它们的值是指针,所以对形参的改变也会反映到实参本身。
- 指针是指保存了另一个变量内存地址的变量。通过指针可以让参数传递的成本最低且内容可修改,而且可以让变量的生命周期独立于作用域。
数组和切片
使用如下语法创建数组。
代码语言:javascript复制[length]Type
[N]Type{value1, value2, ..., valueN}
[...]Type{value1, value2, ..., valueN}
数组的长度是固定的,不可以修改。
数组的容量cap()
和长度len()
都等于数组的长度。
数组按值传递,及传递给函数的是数组的副本,而切片是引用类型,传递的是指针。
代码语言:javascript复制package main
import "fmt"
func changeArray(a [3]int) {
a[0] = 3
}
func main() {
myarray := [3]int{1, 2, 3}
changeArray(myarray)
fmt.Println(myarray) // 因为myarray是数组,所以打印结果为 [1 2 3]
}
代码语言:javascript复制package main
import "fmt"
func changeArray(a []int) {
a[0] = 3
}
func main() {
myarray := []int{1, 2, 3}
changeArray(myarray)
fmt.Println(myarray) // 因为myarray是切片,所以打印结果为 [3 2 3]
}
可以使用下面的方法创建切片。
代码语言:javascript复制make([]Type, length, capacity)
make([]Type, length)
[]Type
[]Type(value1, value2, ..., valueN)
多个切片如果共享一个底层数组,那么对其中一个切片数值的改变,也会影响其他切片。
可以使用for index, item := range s {}
来遍历切片s。
可以使用s = append(s, "a", "b", "c")
或者s = append(s, t...)
来将元素a, b, c和切片t追加到切片s中。
可以使用nr = copy(s, t)
将t切片中的内容拷贝到s中。
可以使用标准库中的sort
包来对排序和搜索切片。
package main
import (
"fmt"
"sort"
)
func main() {
myarray := []int{1, 3, 2}
files := []string{"Test.conf", "utils.go", "Makefile"}
target := "Makefile"
fmt.Println(sort.IntsAreSorted(myarray)) // false
sort.Ints(myarray)
fmt.Println(myarray) //[1 2 3]
sort.Strings(files)
fmt.Printf("%qn", files) // ["Makefile" "Test.conf" "utils.go"]
i := sort.Search(len(files),
func(i int) bool { return files[i] >= target })
if i < len(files) && files[i] == target {
fmt.Printf("found "%s" at files[%d]n", target, i) // found "Makefile" at files[0]
}
}
映射
- 创建映射的方式
make(map[KeyType]ValueType, initialCapacity)
make(map[KeyType]ValueType
map[KeyType]ValueType{}
map[KeyType]ValueType{key1: value1, ..., keyN: valueN}
- 映射的操作
m[k] = v
: 赋值v给映射的键值kdelete(m, k)
: 删除map中的kv := m[k]
: 将map中k对应的值赋值给vv, found := m[k]
: 如果k值不存在,将v赋值为0,found设为falselen(m)
: 返回map中的键值对数目