#Goメモ

#sliceの分割

package main

import "fmt"

func main() {
    a := []int{1, 2, 3}
    b := []int{4, 5, 6}
    c := append(a, b...)
    fmt.Printf("%#v", c)
}

#slice、map、channelはポインタで配列は値

詳しくはこちらを見てください。

#JSONのエンコードとデコード

json:"foo"のようなフィールドタグはvscode-goではGo: Add Tags To Struct Fieldsを使うと自動で付与することができます。

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type Meta struct {
    Foo string `json:"foo"`
    // `json:"-"`にするとエンコード時に結果に反映されない
    Bar string `json:"bar"`
}

type Item struct {
    Name  string `json:"name"`
    Price int    `json:"price"`
    Meta  Meta   `json:"meta"`
}

func main() {
    items := []Item{
        {
            Name:  "name1",
            Price: 11,
            Meta: Meta{
                Foo: "foo",
                Bar: "bar",
            },
        },
        {
            Name:  "name2",
            Price: 23,
            Meta: Meta{
                Foo: "foo",
                Bar: "bar",
            },
        },
    }

    resultString, err := json.Marshal(items)
    if err != nil {
        log.Fatal(err)
    }
    // [{"name":"name1","price":11,"meta":{"foo":"foo","bar":"bar"}},{"name":"name2","price":23,"meta":{"foo":"foo","bar":"bar"}}]
    fmt.Println(string(resultString))

    resultStruct := []Item{}
    if err := json.Unmarshal(resultString, &resultStruct); err != nil {
        log.Fatal(err)
    }
    // []main.Item{main.Item{Name:"name1", Price:11, Meta:main.Meta{Foo:"foo", Bar:"bar"}}, main.Item{Name:"name2", Price:23, Meta:main.Meta{Foo:"foo", Bar:"bar"}}}
    fmt.Printf("%#v", resultStruct)
}