4.数组

倾然丶 夕夏残阳落幕 提交于 2019-12-11 18:31:52

1.数组

1.1数组介绍

数组是同一种数据类型元素的集合。
在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。

基本语法:
//定义一个长度为3,元素类型为int的数组a
var a [3]int

1.2数组定义

var 数组变量名 [元素数量]T
var a [5]int
1.数组的长度必须是常量,
2.并且长度是数组类型的一部分。一旦定义,长度不能改变。
3.[5]int 和[10]int是不同的类型

var a [3]int
var b [4]int
a = b //不可以这样做,因为此时a和b是不同的类型
数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是len-1,访问越界(下标在合法范围外),会触发访问越界,会panic。
package main

import "fmt"

func main() {
    var a =[2]int{1}
    var b =[4]int{1,2,3,4}
    fmt.Printf("%T\n",a)         //[2]int
    fmt.Printf("%T\n",b)        //[4]int
    fmt.Printf("%#v\n",b[0])  //1
    fmt.Printf("%#v\n",b[6])  //invalid array index 6 (out of bounds for 4-element array)
}

1.3数组初始化

1.3.1方式一

初始化数组时,可以使用初始化列表来设置数组元素的值。

package main

import "fmt"

func main() {
    var intArray [3]int
    var numArray = [5]int{1,2,3,4}
    var cityArray = [4]string{"北京","上海"}
    fmt.Printf("%#v\n",intArray)
    fmt.Printf("%#v\n",numArray)
    fmt.Printf("%#v\n",cityArray)
}

结果:
[3]int{0, 0, 0}
[5]int{1, 2, 3, 4, 0}
[4]string{"北京", "上海", "", ""}

1.3.2方式二

按照上买呢的方法,每次都要确保提供的初始值和数组长度一致,一般情况下,我们可以让编译器根据初始值的个数,自行推断数组的长度。

package main

import "fmt"

func main() {
    var intArray [3]int
    var numArray = [...]int{1,2,3,4}
    var cityArray = [...]string{"北京","上海"}
    fmt.Printf("%#v----%T\n",intArray,intArray)
    fmt.Printf("%#v----%T\n",numArray,numArray)
    fmt.Printf("%#v----%T\n",cityArray,cityArray)
}
结果:
[3]int{0, 0, 0}----[3]int
[4]int{1, 2, 3, 4}----[4]int
[2]string{"北京", "上海"}----[2]string

1.3.3方式三

可以使用指定索引值的方式来初始化数组

package main
import "fmt"
func main() {
    var intArray =[...]int{1:1,3:5}
    fmt.Printf("%#v----%T",intArray,intArray)
}

结果:
[4]int{0, 1, 0, 5}----[4]int

1.4数组的遍历

package main
import "fmt"

func main() {
    var stringArray =[...]string{"北京","上海","深圳"}
    //方法一:for循环遍历
    for i:=0;i<len(stringArray);i++{
        fmt.Println(stringArray[i])
    }
    //方法二:for range遍历
    for index,value := range stringArray{
        fmt.Println(index,value)
    }
}

结果:
北京
上海
深圳
0 北京
1 上海
2 深圳

1.5多维数组

1.5.1二维数组的定义

package main

import "fmt"

func main() {
    a:=[3][2]string{
        {"北京","上海"},
        {"北京1","上海1"},
        {"北京2","上海2"},
    }
    fmt.Println(a)
    fmt.Printf("%#v\n",a)
    fmt.Println(a[2][1])
}

结果:
[[北京 上海] [北京1 上海1] [北京2 上海2]]
[3][2]string{[2]string{"北京", "上海"}, [2]string{"北京1", "上海1"}, [2]string{"北京2", "上海2"}}
上海2

1.5.2二维数组的遍历

package main

import "fmt"

func main() {
    a:=[3][2]string{
        {"北京","上海"},
        {"北京1","上海1"},
        {"北京2","上海2"},
    }
    for _,v1 := range a{
        for _,v2:= range v1{
            fmt.Printf("%s\n",v2)
        }
    }
}

结果:
北京
上海
北京1
上海1
北京2
上海2

1.5.3多维数组只有第一层可以使用...让编译器推导数组的长度

多维数组,只有第一层可以使用...来让编译器推导数组长度。
//支持的写法
a := [...][2]string{
    {"北京", "上海"},
    {"广州", "深圳"},
    {"成都", "重庆"},
}
//不支持多维数组的内层使用...
b := [3][...]string{
    {"北京", "上海"},
    {"广州", "深圳"},
    {"成都", "重庆"},
}

1.6数组是值类型

数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。

package main

import "fmt"
func modifyArray(x [3]int){
    x[0]=100
    fmt.Printf("modifyArray-x--%#v\n",x)
}
func modifyArray2(x [3][2]int){
    x[2][0]=100
    fmt.Printf("modifyArray2-x--%#v\n",x)
}
func main() {
    a := [3]int{1,2,3}
    modifyArray(a)
    fmt.Printf("main-a--%#v\n",a)
    b := [3][2]int{
        {1,2},
        {3,4},
    }
    modifyArray2(b)
    fmt.Printf("main-b--%#v\n",b)
}

结果:
modifyArray-x--[3]int{100, 2, 3}
main-a--[3]int{1, 2, 3}
modifyArray2-x--[3][2]int{[2]int{1, 2}, [2]int{3, 4}, [2]int{100, 0}}
main-b--[3][2]int{[2]int{1, 2}, [2]int{3, 4}, [2]int{0, 0}}
注意:
1.数组支持"=="、"!="操作符,因为内存总是被初始化过的。
2.[n]*T表示指针数组,*[n]T表示数组指针。

1.7练习

1.求数组[1, 3, 5, 7, 8]所有元素的和
package main

import "fmt"

func sumArray(x [5]int)(sum int){
    sum = 0
    for _,v := range x{
        sum+=v
    }
    return sum

}
func main() {
    a := [5]int{1,3,5,7,8}
    sum := sumArray(a)
    fmt.Println(sum)
}

结果:
24
2.找出数组中和为指定值的两个元素的下标,比如从数组[1, 3, 5, 7, 8]中找出和为8的两个元素的下标分别为(0,3)和(1,2)。

package main
import "fmt"
func sumArray(x [5]int)(result [][2]int){
    for index1,value1 := range x{
        for index2,value2 := range x{
            if index1==index2{
                continue
            }
            if value1+value2==8{
                result = append(result,[2]int{index1,index2})
            }
        }
    }
    //因为[[0 3] [1 2] [2 1] [3 0]],有重复的,所以取一半
    return result[0:len(result)/2]
}
func main() {
    a := [5]int{1,3,5,7,8}
    result := sumArray(a)
    fmt.Printf("%v",result) //[[0 3] [1 2]]
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!