Go 中的複合字面量

Jay Singh 2023年1月30日
  1. 在 Go 中切片複合文字
  2. Go 中的陣列複合文字
Go 中的複合字面量

Go 有各種內建的識別符號型別,也稱為預宣告型別,例如 boolean、string、numeric(float32、float64、int、int8、int16、int32、complex)等。

還有複合型別,由預先宣告的型別組成。陣列、結構、切片和對映的值是使用複合文字構造的。

每次對其進行評估時,都會建立一個新值。它由字面量的型別後跟大括號繫結的專案列表組成。

讓我們看一些複合文字例項。

在 Go 中切片複合文字

Slice 是一種複合資料型別,其工作方式類似於陣列,因為它包含相同資料型別的專案。陣列和切片之間的關鍵區別在於切片可以動態更改大小,而陣列不能。

package main

import "fmt"

func main() {
    s1 := []int{1, 2, 3, 4}
    fmt.Println(s1)
}

輸出:

[1 2 3 4]

Go 中的陣列複合文字

當一個對映分配給另一個對映時,這兩個對映共享所有(底層)元件。向一張對映新增專案(或從中刪除元素)會影響另一張對映。

如果將一個切片分配給另一個切片,則兩者將共享所有(底層)元件,就像對映分配一樣。它們的相對長度和容量是相等的。

如果一個切片的長度或容量稍後發生變化,則該變化不會反映在另一個切片中。當一個被分配給另一個時,所有專案都從源陣列複製到目標陣列。

這兩個陣列不共享任何元素。

package main

import "fmt"

func main() {
    m0 := map[int]int{0: 2, 1: 3, 2: 4}
    m1 := m0
    m1[0] = 4
    fmt.Println(m0, m1)

    s0 := []int{5, 6, 7}
    s1 := s0
    s1[0] = 4
    fmt.Println(s0, s1)

    a0 := [...]int{5, 6, 7}
    a1 := a0
    a1[0] = 4
    fmt.Println(a0, a1)
}

輸出:

map[0:4 1:3 2:4] map[0:4 1:3 2:4]
[4 6 7] [4 6 7]
[5 6 7] [4 6 7]