Python中的数组(这里指的是List类型)及其切片Slice基本相同,但在Go语言中这两者差别很大。
Go语言中的数组(Array)存放的是长度固定、类型固定并且存储位置连续的一系列元素。
Go语言中数组的声明方式如下:
arr1 := [5]string{"a", "b", "c", "d", "e"}
arr2 := [...]string{"g", "h", "i"} //自动推导出数组长度,省略号不可忽略
arr3 := [5]string{1: "j", 2: "k"} //指定索引为1和2的元素值,其余默认为空
arr4 := [100]int{} //创建一个保存1到100的整数的数组
for i := 0; i < len(arr4); i++ {
arr4[i] = i + 1
}
Go语言中数组的遍历可以使用range。具体如下:
package main
import (
"fmt"
"strconv"
)
func main() {
arr0 := [3]string{"hello", "nihao", "dajiahao"}
for i, v := range arr0 {
fmt.Println("数组arr0的第" + strconv.Itoa(i) + "个元素为:" + v)
}
arr1 := [100]int{} //创建一个保存1到100的整数的数组
for i := 0; i < len(arr1); i++ {
arr1[i] = i + 1
}
sum1 := 0 //计算1+2+3+……+100
for _, v := range arr1 {
sum1 += v
}
fmt.Println("1到100的相加总和为:" + strconv.Itoa(sum1))
}
Go语言的切片虽然也是基于数组来实现的,但两者在使用上有些差别。
Go语言中常用的切片的声明方法如下:
package main
import (
"fmt"
"strconv"
)
func main() {
array := [7]int{1, 2, 3, 4, 5, 6, 7}
slice0 := array[2:6] //利用数组生成切片
fmt.Println("slice0更改前:", slice0)
slice0[1] = 10
fmt.Println("slice0更改后:", slice0)
fmt.Println("slice0更改后的array:", array)
slice1 := []string{"a", "b", "c"} //中括号里面不要加...
fmt.Println("切片slice1:", slice1)
slice2 := make([]string, 4, 8) //声明一个长度为4,容量为8的空切片
fmt.Println("切片slice2:", slice2)
fmt.Println("切片slice2,长度为:" + strconv.Itoa(len(slice2)) + ",容量为:" + strconv.Itoa(cap(slice2)))
}
其执行结果如下:
slice0更改前: [3 4 5 6]
slice0更改后: [3 10 5 6]
slice0更改后的array: [1 2 3 10 5 6 7]
切片slice1: [a b c]
切片slice2: [ ]
切片slice2,长度为:4,容量为:8
关于切片有以下几点说明:
Go语言中的切片可以看作是不定长数组,可以通过append函数向切片中添加元素,返回新切片。
package main
import "fmt"
func main() {
slice2 := []string{"2", "3", "3"}
slice3 := make([]string, 4, 8)
fmt.Println("slice3的内存地址:", &slice3[0])
slice4 := []string{"f", "g"}
slice3 = append(slice3, slice4...)
fmt.Println("slice3的内存地址:", &slice3[0])
slice3 = append(slice3, slice2...)
fmt.Println("slice3的内存地址:", &slice3[0])
fmt.Println(slice3)
}
其执行结果如下:
slice3的内存地址: 0xc00011c000
slice3的内存地址: 0xc00011c000
slice3的内存地址: 0xc000122000
[ f g 2 3 3]
这里要注意以下几点: