Go语言:数组和切片

  Python中的数组(这里指的是List类型)及其切片Slice基本相同,但在Go语言中这两者差别很大。

1 数组

Go语言中的数组(Array)存放的是长度固定、类型固定并且存储位置连续的一系列元素。

1.1 声明

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
	}
1.2 遍历

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))
}

2 切片

Go语言的切片虽然也是基于数组来实现的,但两者在使用上有些差别。

2.1 声明

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语言给slice2分配了一块容量为8的内存空间,但目前只有4个内存空间有元素(“”)。
  • 切片的循环遍历方法与数组相同,这里不再详细介绍。
2.2 append函数

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]

这里要注意以下几点:

  • append()中的参数可以是单个字符,也可以是切片类型,但不可以是数组。
  • 当切片的容量未满时,往切片内添加新的元素时,新元素会追加在原切片元素的后面。若切片容量满了,则会开辟一片新的内存空间。

你可能感兴趣的:(#,Go语言,golang,开发语言,后端)