4
1

More than 3 years have passed since last update.

【golang】ネストしたstructに値を入れる方法

Last updated at Posted at 2019-11-16

概要

ネストしたstructに値を入れる方法と実践での注意点。

記述方法

基本的には以下のルールで記述が可能。

main.go
package main
import "fmt"

type A struct {
    AKey1 string
    AKey2 string
    B
}

type B struct {
    BKey1 string
    BKey2 string
}

func main() {
    // key:valueで記述が可能
    var st1 = A{
        AKey1: "val1",
        AKey2: "val2",
        B: B{
            BKey1: "val3",
            BKey2: "val4",
        },
    }

    // keyの省略も可能
    var st2 = A{
        "val1",
        "val2",
        B{
            "val3",
            "val4",
        },
    }

    //宣言してから 変数.key = val でも可能
    var st3 = A{}
    st3.AKey1 = "val1"
    st3.AKey2 = "val2"
    st3.BKey1 = "val3"
    st3.BKey2 = "val4"

    fmt.Printf("%#v\n", st1)
    fmt.Printf("%#v\n", st2)
    fmt.Printf("%#v\n", st3)
    //=> main.A{AKey1:"val1", AKey2:"val2", B:main.B{BKey1:"val3", BKey2:"val4"}}
}

実践における注意点

「B:B{}」の部分も「key:value{}」なので注意。

B: B{BKey1: "val3",BKey2: "val4",},
//=> key: value{BKey1: "val3",BKey2: "val4",}

したがってstructを以下の様に別のpackageにしてまとめている場合は、packageをimportして以下の様にしなければならない。

model.go
package model

type A struct {
    AKey1 string
    AKey2 string
    B
}

type B struct {
    BKey1 string
    BKey2 string
}
main.go
var st1 = model.A{
  AKey1: "val1",
  AKey2: "val2",
  B: model.B{
    BKey1: "val3",
    BKey2: "val4",
  },
}

var st3 = model.A{}
st3.AKey1 = "val1"
st3.AKey2 = "val2"
st3.BKey1 = "val3"
st3.BKey2 = "val4"

// packageが別れている場合、keyを省略した書き方は
//  go-vetに「composite literal uses unkeyed fields」と怒られるので注意。

感想

作業中に例の「B:model.B{}」でちょっと詰まったので書き起こした。
とはいえ大体はst3の記述方法が採択されそう。

4
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1