基础内置函数
len
查看可迭代对象的长度
func main() {
var a [5]int
fmt.Println("len is arrays: ", len(a))
}
make
函数
new和make是内建的两个函数,主要用来创建分配类型内存。
make返回的还是这三个引用类型本身;而new返回的是指向类型的指针
// func make(t Type,size IntegerType) Type
// 内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型
array := make(int[], n)
new
函数
对于引用类型的变量,我们不仅要声明它, 还要为它分配内容空间,所以要使用 new 和 make 函数进行分配内存
// 下面这个例子肯定会报错
// panic: runtime error: invalid memory address or nil pointer dereference
// 为什么呢?
// 因为我们只是声明了这个引用类型变量,而没有去给它分配内存空间
func main() {
var i *int
*i = 10
fmt.Println(*i)
}
// 那我们要怎么修改呢?
// 看下面这个例子
func main() {
var i *int
i = new(int)
*i = 10
fmt.Println(*i)
}
// func new(Type) *Type
// new这个函数,只接收一个参数,这个参数是一个类型,分配好之后,返回一个指向该类型内存地址的指针,同时请注意,它同时会把内存中置为0,也就是该类型中的空值
cap(s)
查看切片的容量
func main() {
// 创建长度和容量都为3的字符串切片
array := []string{"a", "b", "c"}
fmt.Println("array len & cap ", len(array), cap(array))
// 创建一个长度为2 ,容量为3的切片
array2 := array[0,2]
fmt.Println("array2 len & cap ", len(array2), cap(array2))
}
// array len & cap 3 3
// array2 len & cap 2 3
copy
复制切片
函数 copy 在两个 slice 间复制数据,复制⻓度以 len 小的为准,两个 slice 指向同⼀底层数组。直接对应位置覆盖
func main() {
s1 := []int{1,2,3,4}
s2 := []int{5,6}
fmt.Println("before s1 s2", s1, s2)
// 将s2 的值 ,拷贝到s1
copy(s1, s2)
fmt.Println("last s1 s2", s1, s2)
}
// before s1 s2 [1 2 3 4] [5 6]
// last s1 s2 [5 6 3 4] [5 6]