4.數組

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]]
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章