簡單分析Go語言中陣列的這些細節

大雄45發表於2023-03-26
導讀 這篇文章主要為大家詳細介紹了Go語言中陣列一些細節的相關資料,文中的示例程式碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以瞭解一下
Go語言基礎二
len&cap

書接上文,我們提到二維陣列中的第二個維度的陣列不能用...來表示,接下來我們要認識兩個新的函式,它們分別是len和cap

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

由上方程式碼可知,我們在main函式里面定義了一個a陣列,長度為2,未進行初始化變數等賦值操作,所以陣列元素均為0;呼叫列印函式輸出的是陣列a的length和cap值,這裡執行結果均為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語言在二維陣列和遍歷陣列中的一些應用。如遍歷陣列的一個固定格式,亦或是陣列的複製與傳參,這些都值得讀者去仔細推敲

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2929393/,如需轉載,請註明出處,否則將追究法律責任。

相關文章