淺析Go語言中數組的這些細節

Go語言基礎二

len&cap

書接上文,我們提到二維數組中的第二個維度的數組不能用...來表示,接下來我們要認識兩個新的函數,它們分別是lencap

package main
​
func main() {
    a := [2]int{}
    println(len(a), cap(a)) 
}

由上方代碼可知,我們在main函數裡面定義瞭一個a數組長度為2未進行初始化變量等賦值操作,所以數組元素均為0;調用打印函數輸出的是數組a的lengthcap值,這裡運行結果均為2

二維數組的遍歷

接下來我們重點講一下二維數組的遍歷,有些小夥伴可能就要問瞭:我沒學過什麼遍歷循環啊,這讓我怎麼理解?

別急,咱們看代碼主要看的是一個思路過程~

package main
import (
    "fmt"
)
func main() {
    var f [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
    for k1, v1 := range f {
        for k2, v2 := range v1 {
            fmt.Printf("(%d,%d)=%d ", k1, k2, v2)
        }
        fmt.Println()
    }
}

首先我們可以看到在main函數裡面定義瞭一個int類型,名叫f的數組,它的屬性為2行3列,第一行存儲的是 {1,2,3} ,第二行存儲的是 {7,8,9} ,我們通過for循環對二維數組進行一次遍歷,讀者暫時可以把它理解成一個循環的固定格式,後續循環會為讀者一一介紹,由於本次數組是二維數組,所以我們需要調用兩次for循環來對數組進行遍歷,通過函數打印輸出所需要的值

數組的拷貝與傳參

package main
import "fmt"
func printArr(arr *[5]int) {
    arr[0] = 10
    for i, v := range arr {
        fmt.Println(i, v)
    }
}
func main() {
    var arr1 [5]int
    printArr(&arr1)
    fmt.Println(arr1)
    arr2 := [...]int{2, 4, 6, 8, 10}
    printArr(&arr2)
    fmt.Println(arr2)
}

首先我們可以看到定義瞭一個printArr方法,並在方法裡面內置瞭一個長度為5、int類型的數組。緊接著我們將數組的第一個元素賦值為10,緊接著對數組進行循環遍歷,分別輸出數組的索引及索引位置上的值

回到main方法中,我們定義瞭一個名叫arr1,長度為5,int類型的數組,並直接打印該數組的地址值,同時調用函數打印出該數組未進行初始化時候的值,顯而易見的是,由於我們在printArr中已經對索引位置為1的數組的值進行瞭一次修改,所以本次打印輸出數組的時候,也會受到上一次數組的影響,所以本次數組打印輸出的結果為[10 0 0 0 0]。緊接著,我們定義瞭一個名叫arr2,長度為任意,int類型的數組,同時給予賦值操作,但是由於在printArr索引為1的數組的位置的值已經發生瞭改變,所以本次arr2數組打印輸出的結果為[10 4 6 8 10]

求數組所有元素之和

package main
import (
    "fmt"
    "math/rand"
    "time"
)
func sumArr(a [10]int) int {
    var sum int = 0
    for i := 0; i < len(a); i++ {
        sum += a[i]
    }
    return sum
}
func main() {
    rand.Seed(time.Now().Unix())
    var b [10]int
    for i := 0; i < len(b); i++ {
        b[i] = rand.Intn(1000)
    }
    sum := sumArr(b)
    fmt.Printf("sum=%d\n", sum)
}

我們首先定義瞭一個方法名叫sumArr,同時往該方法裡面傳入一個名為a,長度為10,數據類型為int類型的數組。在本方法裡面,我們定義一個變量為sum,使用for循環來對數組進行遍歷操作,同時使用sum來記錄該數組各元素的和,最終返回sum的值

緊接著我們看到main方法,我們在該方法中使用rand.seed()函數來定義一個隨機數,同時初始化一個名為b,長度為10,數據類型為int類型的數組使用for循環對該數組進行遍歷,同時將隨機數的值賦給b數組中元素。最終我們將數組sumArr中b的值賦給sum,調用函數進行打印輸出sum的值

例題:數組元素匹配問題

找出數組中和為給定值的兩個元素的下標,例如數組[1,3,5,8,7],

找出兩個元素之和等於8的下標分別是(0,4)和(1,2)

求元素和,是給定的值

package main
import "fmt"
func myTest(a [5]int, target int) {
    // 遍歷數組
    for i := 0; i < len(a); i++ {
        other := target - a[i]
        // 繼續遍歷
        for j := i + 1; j < len(a); j++ {
            if a[j] == other {
                fmt.Printf("(%d,%d)\n", i, j)
            }
        }
    }
}
func main() {
    b := [5]int{1, 3, 5, 8, 7}
    myTest(b, 8)
}

根據題意,我們可以得知,在myTest方法裡面我們定義瞭一個名為a,長度為5,數據類型為int類型的數組,同時還定義瞭一個目標值target用於檢驗元素和是否正確。

緊接著我們對該數組進行遍歷,定義other變量用於表示另一個數組元素,這裡進行二次遍歷的原因是因為本條題目需要匹配數組中兩個元素的值,因此進行二次遍歷匹配數組中i的值,一旦與other匹配上,即打印輸出該數組的值(兩個元素)

我們在main函數中對數組b進行變量初始化的賦值操作,以便進行方法的調用,如果在數組中能夠找到myTest()方法中的第二個,即target元素,就打印輸出這兩個元素,反之則什麼都不打印

今日總結

今天我們主要學習瞭Go語言二維數組和遍歷數組中的一些應用。如遍歷數組的一個固定格式,亦或是數組的拷貝與傳參,這些都值得讀者去仔細推敲

到此這篇關於淺析Go語言中數組的這些細節的文章就介紹到這瞭,更多相關Go語言數組內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: