1.数组和切片的区别
数组是类型相同元素的集合,go不允许在数组中混合不同类型的元素.
数组定义是需要指定数组的长度,切片不用指定
2.数组如何定义
- 定义方式一:
{
var a [3]int
a[0] = 12
a[1] = 13
a[2] =14
}
- 定义方式二:
{
a := [3]int{12,13,14}
}
- 定义方式三:
在定义数组时可以忽略数组长度的定义,可以用[...]代替,让编译器帮你推断你定义的数组的长度.
{
a := [...] int {1,2,3,4}
}
3.关于数组的使用
数组是不能动态扩展长度的,但是切片可以解决这个局限.
举个例子: 下面的这段代码会报错:cannot use a (type [3]int) as type [5]int in assignment
。
func main(() {
a := [3]int{1,2,1}
var b [5]int
b = a
}
- 数组是值类型而不是引用类型.这意味着数组变量被赋值时,得到的是原始组的值的拷贝.对原数组不会造成影响.
package main
import "fmt"
func main() {
a := [...]string{"USA", "China", "India", "Germany", "France"}
b := a // a copy of a is assigned to b
b[0] = "Singapore"
fmt.Println("a is ", a)
fmt.Println("b is ", b)
}
上面程序的第 7 行,将数组 a
的拷贝赋值给数组 b
。第 8 行,b
的第一个元素被赋值为 Singapore
。这将不会影响到原数组 a
。程序的输出为:
a is [USA China India Germany France]
b is [Singapore China India Germany France]
同样,如果把数组当作参数传递给函数,也是数值的传递,不会对原数组元素造成影响.
- 数组的长度,用内置函数len()获取
{
a := [...]string{china,usa}
log.println("the length of a:", len(a))
}
- 遍历数组
- 方式一:for循环遍历
package main
import "log"
func main(){
a := [...]float64{1.22,3.2,34.67}
for(int i := 0; i < len(a); i++){
log.printf("%d the element is %.2f",i,a[i])
}
}
- 方式二:用range遍历数组
func main(){
a := [...]float64{1.22,3.2,34.67}
for i,v := range a { //表示第i个位置的value
log.printf("%d the element is %.2f",i,v)
}
}
4.切片(slices)如何定义
切片
切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构。切片并不存储任何元素而只是对现有数组的引用。
切片的几个常用因素:长度,容量
切片的长度指的是切片中元素的个数,切片的容量指的是从切片的起始元素开始到底层数组的最后一个元素的个数.
在下面的例子中切片的长度是2,切片的容量时4,输出b为uk,usa
追加元素到切片中,用append
{
//创建切片方式一:
a := [5]string{china,uk,usa,japan,cannada}
b := a[1:3]
//创建切片方式二:用make创建切片
i := make([]int,5,5)
//追加元素到切片方式一:
a = {a,apple,pear}//此时切片的容量变为原数组长度的2倍,即10
//追加元素到切片
c := [2]string{ab,cd}
d := append(a,c...)
}
切片也可以当作参数传进函数
多维切片
{
a := [][]string{
{beijing,shanghai},
{shandong,hebei},
}
}