Go の複合リテラル

Jay Singh 2023年1月30日
  1. Go でコンポジットリテラルをスライスする
  2. Go の配列複合リテラル
Go の複合リテラル

Go には、ブール、文字列、数値(float32、float64、int、int8、int16、int32、complex)など、事前に宣言された型とも呼ばれるさまざまな組み込みの識別子型があります。

事前に宣言されたタイプで構成される複合タイプもあります。配列、構造体、スライス、およびマップの値は、複合リテラルを使用して作成されます。

それらが評価されるたびに、新しい値が作成されます。これは、リテラルのタイプとそれに続く中括弧で囲まれたアイテムのリストで構成されます。

いくつかの複合リテラルインスタンスを見てみましょう。

Go でコンポジットリテラルをスライスする

スライスは、同じデータ型のアイテムを保持するという点で配列と同様に機能する複合データ型です。配列とスライスの重要な違いは、スライスは動的にサイズを変更できるのに対し、配列は変更できないことです。

package main

import "fmt"

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

出力:

[1 2 3 4]

Go の配列複合リテラル

1つのマップが別のマップに割り当てられると、2つのマップはすべての(基礎となる)コンポーネントを共有します。一方のマップにアイテムを追加する(または要素を削除する)と、もう一方のマップに影響します。

スライスが別のスライスに割り当てられている場合、マップの割り当てと同様に、2つはすべての(基礎となる)コンポーネントを共有します。それらの相対的な長さと容量は同じです。

一方のスライスの長さまたは容量が後で変更された場合、その変更はもう一方のスライスには反映されません。1つが別のアイテムに割り当てられると、すべてのアイテムがソース配列から宛先配列にコピーされます。

2つの配列は要素を共有しません。

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]