07-数组和切片

数组

数组是同一类型元素的集合。例如,整数集合 5,8,9,79,76 形成一个数组。Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(译者注:当然,如果是 interface{} 类型数组,可以包含任意类型)

注意:数组在定义阶段,长度和类型就固定了,以后不能更改

数组的声明

一个数组的表示形式为[n]T。n表示数组中元素的数量,T代表每个元素的类型。元素n也是该类型的一部分

例子:最简单的定义

package main
import "fmt"

func main() {
    var a[5]int  #定义一个长度为5的int类型数组,因为没有赋值int是0
    fmt.Println(a)
}
#结果
[0 0 0 0 0]

定义并赋初值

package main
import "fmt"

func main() {
  #三种定义赋值的方式,因为只赋值了4个值,所以最后一个为0 var a[
5]int=[5]int{1,2,3,4} #第一种 var a=[5]int{1,2,3,4} #第二种 a:=[5]int{1,2,3,4} #第三种 a[2]=100 #索引值为2的数据修改为100 fmt.Println(a) }
#结果都是
[1 2 100 4 0]

定义时给定某位置赋值

例子:给第5个位置设置为99

package main
import "fmt"

func main() {
    a:=[10]int{1,2,4:99}  #注意:go语言数组不支持负索引a[-2]这样的
    fmt.Println(a)
}
#结果
[1 2 0 0 99 0 0 0 0 0]

数组是值类型

Go 中的数组是值类型而不是引用类型。这意味着当数组赋值给一个新的变量时,该变量会得到一个原始数组的一个副本。如果对新变量进行更改,则不会影响原始数组。

所有的函数传参都是copy传递,在python传参不可变类型是值传参,复制值的大小,可变类型是引用传参,复制值的地址传递

package main
import "fmt"

func main() {    
    a:=[4]int{1,2,3,4}
    test6(a)
    fmt.Println(a)
}
func test6(b [4]int){
    b[0]=100  #b的数据修改不会影响到a
    fmt.Println(b)
}
#结果

[100 2 3 4]
[1 2 3 4]

数组的长度

使用len函数,得到数组的长度

package main
import "fmt"

func main() {
    a:=[4]int{1,2,3,4}
    fmt.Println(len(a))
}
#结果
4

数组大小是类型一部分

var a [4]int=[4]int{1,2,}
var b [5]int=[5]int{4,5,}

这两个数组类型不一样的,因为考虑到长度大小不一样

与或非(&&   ||  !)

a:=10
if !(a>9||a<6){

}

使用range迭代数组

用for循环遍历数组中的元素

package main
import "fmt"

func main() {
    var a =[4]int{1,2,}
    for i:=0;i<len(a);i++{
        fmt.Println(a[i])
    }
}
#结果
1 2 0 0

Go提供了通过使用for循环的range方法来遍历数组。range返回索引和该索引处的值

注意:如果range有两个返回值接收:一个是索引值,一个是值。如果只有一个返回值接收:就只显示索引

package main
import "fmt"

func main() {
    var a =[4]int{1,2,}
    for i,v:=range a {  #如果有两个值接收:一个是索引,一个是值。
        fmt.Println("------",i)
        fmt.Println(v)
    }
}

多维数组

package main
import "fmt"

func main() {
    var a [7][2]int   #生成7个
    a[0][1]=100
    fmt.Println(a)
}
#结果
[[0 100] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0]]

猜你喜欢

转载自www.cnblogs.com/wangcuican/p/12019518.html