go数组
数组是一组相同类型元素的线性序列,在go中,数组是值类型,所以拷贝时效率较低。并且数组的大小也是类型的一部分,所以[5]T
和[10]T
是不同的数组类型。
初始化
方式 | 代码示例 |
---|---|
默认值初始化,所有元素为默认值 | var arr [10]int |
字面值初始化 | var arr = [3]int{1, 2, 3} |
也可以自动推导数组长度 | var arr = [...]int{1, 2, 3} |
指定特定元素的值,其余元素还是默认值 | var arr = [3]int{2: 1} |
访问不存在的元素会panic
func main() {
var ns [10]int
for i := 0; i <= len(ns); i++ {
// 当i等于10时,抛出panic: runtime error: index out of range [10] with length 10
fmt.Println(ns[i])
}
}
for range遍历数组
func main() {
var ns [10]int
for idx, n := range ns {
fmt.Println(idx, n)
}
}
数组的比较
若两个数组的类型是一样的,并且数组元素是可比较的,那么该数组也是可以比较的,==
操作符会自动判断数组中的元素是否一一相等。
func main() {
var ns [10]int
var ns2 [10]int
fmt.Println(ns == ns2)
}
go切片
切片slice是对数组的引用,多个slice可以指向相同的底层数组,并且支持动态扩展长度。slice中记录了底层数组的地址,slice包含的元素个数,slice支持的总的容量。
初始化
方式 | 代码示例 |
---|---|
默认初始化为nil |
var slice []int |
字面值,相当于从数组中截取 | slice := []int{1, 2, 3} |
make |
slice := make([]int, len, cap) |
从数组中截取,表示截取[startIdx, endIdx) | slice := array[startIdx:endIdx] |
从切片中截取,表示截取[startIdx, endIdx) | slice := slice[startIdx:endIdx] |
访问不存在的元素会panic
同数组类似。
for range遍历数组
同数组类似。
切片的比较
切片类型是不能相互比较的,只能和nil
进行比较,判断是否为nil
切片。要实现包含的元素是否相等就要自己写个循环判断。
func main() {
var ns []int
fmt.Println(ns == nil) // true
}
nil切片和空切片
nil
切片和空切片是不一样的,nil
切片表示这个切片对象为空,空切片表示切片中包含的元素为空。
s1 := []int{} // 空切片
var s2 []int // nil切片
append追加元素
使用系统的append函数,超出当前容量后(cap
),会以2倍的增速重新申请空间,得到一个新的底层数组,然后将原切片中的元素拷贝到新的切片中。
func main() {
s1 := []int{}
s1 = append(s1, 1, 2, 3)
fmt.Println(s1) // [1 2 3]
}
参考资料
标签:slice,int,元素,切片,var,数组,go 来源: https://www.cnblogs.com/HachikoT/p/15782078.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。