目录
  • 一、数组
    • 1、数组的定义
    • 2、数组赋值
    • 3、定义并初始化
    • 4、数组的大小是类型的一部分
    • 5、数组是值类型
    • 6、数组长度 len() 数组长度在定义阶段已经固定
    • 7、数组循环
    • 8、多维数组
    • 9、数组定义并指定位置初始化
  • 二、切片基础
    • 1、切片的定义
    • 2、使用切片
    • 3、修改切片,会影响数组
    • 4、修改数组也会影响切片
    • 5、切片只切数组的一部分
    • 6、当多个切片共用相同的底层数组时,每个切片所做的更改将反应在数组中
    • 7、切片的长度和容量
    • 8、切片追加值

一、数组

数组是同一类型元素的集合,可以放多个值,但是类型一致,内存中连续存储

Go 语言中不允许混合不同类型的元素,而且数组的大小,在定义阶段就确定了,不能更改

1、数组的定义

//定义一个大小为3的string类型和int8类型的数组,里面可以放3个字符串和3个数字var names [3]stringvar ages [3]int8fmt.Println(names, ages) //输出:[  ] [0 0 0]

2、数组赋值

var ages [3]int8ages[0] = 18ages[2] = 22fmt.Println(ages)fmt.Println(ages[1])//输出[18 0 22]0

3、定义并初始化

//方式一:var ages [3]int = [3]int{1, 2, 3}fmt.Println(ages) //输出:[1 2 3]//方式二:var ages = [3]int{1, 2, 3}fmt.Println(ages) //输出:[1 2 3]//方式三:...后面放几个值,数组大小就是多少var ages = [...]int{1, 2, 3, 4, 5, 6, 7, 8}fmt.Println(ages) //输出:[1 2 3 4 5 6 7 8]//方式四:ages := [...]int{1, 2, 3, 4, 8}fmt.Println(ages) //输出:[1 2 3 4 8]

4、数组的大小是类型的一部分

var a [2]int = [2]int{1, 2}var b [2]int = [2]int{1, 3}b = a  //如果不是同一种类型,不允许相互赋值fmt.Println(b)

5、数组是值类型

copy 
var a = [2]int{1, 2}fmt.Println(a) //[1 2]test(a)  //[99 2]fmt.Println(a) //[1 2]func test(a [2]int) { a[0] = 99 fmt.Println(a)}

6、数组长度 len() 数组长度在定义阶段已经固定

var a = [2]int{1, 2} fmt.Println(len(a))  //输出:2

7、数组循环

//普通循环var a = [...]int{7, 6, 5, 4, 3, 2, 1}fori := 0; i < len(a); i++ {   fmt.Println(a[i])}//通过 range 来循环(range不是一个内置函数,是一个关键字如:for,if,else)//如果用一个变量接收,这个值是可迭代的索引//如果用两个变量接收,这两个变量一个是索引,一个是具体的值var a = [...]int{7, 6, 5, 4, 3, 2, 1}fori, value := range a {    fmt.Println(i) //索引    fmt.Println(value) //值}//不要索引只要值循环打印for_, value := range a { fmt.Println(value)}

8、多维数组

var a [3][3]int //定义a[0][1] = 20 //使用fmt.Println(a) //输出:[[0 20 0] [0 0 0] [0 0 0]]//定义并赋初始值var a [3][3]int = [3][3]int{{1}, {2, 3, 4}, {5, 6}}fmt.Println(a) //输出:[[1 0 0] [2 3 4] [5 6 0]]//循环多维数组var a [3][3]int = [3][3]int{{1}, {2, 3, 4}, {5, 6}}for_, value := range a {   for_, inValue := range value {      fmt.Println(inValue)   }}

9、数组定义并指定位置初始化

//在索引为5和7的位置指定初始化值var ages [10]int = [10]int{5: 55, 7: 77}fmt.Println(ages) //输出:[0 0 0 0 0 55 0 77 0 0]

二、切片基础

Wrapper

它本身不拥有任何数据,只对现有数组的引用。

1、切片的定义

//定义一个数组var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}//基于数组,做一个切片b := a[:]fmt.Println(b)   //输出:[9 8 7 6 5 4 3 2 1 0]fmt.Printf("%T", b)  //输出:[]int  中括号中不带东西,就是切片类型fmt.Println(a)   //输出:[9 8 7 6 5 4 3 2 1 0]fmt.Printf("%T", a)  //输出:[10]int

2、使用切片

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[:]fmt.Println(b[0]) //输出:9fmt.Println(b[2]) //输出:7

3、修改切片,会影响数组

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[:]b[0] = 99 //修改切片fmt.Println(b) //输出:[99 8 7 6 5 4 3 2 1 0]//数组会被修改fmt.Println(a) //输出:[99 8 7 6 5 4 3 2 1 0]

4、修改数组也会影响切片

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[:]a[1] = 99 //修改数组fmt.Println(a) //输出:[9 99 7 6 5 4 3 2 1 0]//切片也会被修改fmt.Println(b) //输出:[9 99 7 6 5 4 3 2 1 0]

5、切片只切数组的一部分

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[3:6]//修改切片b[0] = 66fmt.Println(b)  //输出:[66 5 4]fmt.Println(a)  //输出:[9 8 7 66 5 4 3 2 1 0]//修改数组a[4] = 55fmt.Println(b)  //输出:[66 55 4]fmt.Println(a)  //输出:[9 8 7 66 55 4 3 2 1 0]

6、当多个切片共用相同的底层数组时,每个切片所做的更改将反应在数组中

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[3:5]c := a[4:6]fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 1 0]fmt.Println(b) //输出:[6 5]fmt.Println(c) //输出:[5 4]b[1] = 555fmt.Println(a) //输出:[9 8 7 6 555 4 3 2 1 0]fmt.Println(b) //输出:[6 555]fmt.Println(c) //输出:[555 4]

7、切片的长度和容量

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[3:7]fmt.Println(b) //输出:[6 5 4 3]fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 1 0]//切片长度fmt.Println(len(b))    //输出:4//切片容量(我最多能存多少值,从切片的起始位置开始往后所有的,从索引为3开始)fmt.Println(cap(b))    //输出:7

8、切片追加值

var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[6:8]b = append(b,11)b = append(b,22)fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 11 22]//追加到临界点了在追加b = append(b,33)b = append(b,44)fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 11 22]fmt.Println(b) //输出:[3 2 11 22 33 44]//数组长度不会在变了,他会在原来基础上翻倍,把我原来那个值copy到我新的数组上a和b已经没有关系了b[0] = 33fmt.Println(b) //输出:[33 2 11 22 33 44]fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 11 22]

原文链接:https://www.cnblogs.com/XiaoYang-sir/p/15375931.html