Golang にて struct の中身を for で取得する

struct で生成した中身を map のように for で取得する。
Test という struct を定義。 NewTest() で適当に値を入れて返す。

type Test struct {
	A string
	B bool
	C int
	D string
}

func NewTest() *Test {
	return &Test{
		A: "this is A.",
		B: true,
		C: 99,
		D: "this is D.",
	}
}

下記のように for をすると「cannot range over test (type *Test)」というエラーがでる。

test := NewTest()
for _, t := range test {
	// cannot range over test (type *Test)
}

struct の諸々を取得したい時は、
パッケージの reflect を使う。

サンプルコード

struct で生成した中身( key と value ?)をそれぞれ取得する。
type StructTag を使えばタグの値も取得できる。

package main

import (
	"fmt"
	"reflect"
)

type Test struct {
	A string `json:"a"`
	B bool `json:"b"`
	C int `json:"c"`
	D string `json:"d"`
}

func NewTest() *Test {
	return &Test{
		A: "this is A.",
		B: true,
		C: 99,
		D: "this is D.",
	}
}

func main() {
	test := NewTest()
	t := reflect.TypeOf(*test)
	elem := reflect.ValueOf(test).Elem()
	cnt := elem.NumField()
	// cnt := t.NumField() // こちらでも可
	for i := 0; i < cnt; i++ {
		fmt.Print(t.Field(i).Name)
		fmt.Print(": ")
		fmt.Print(elem.Field(i))
		fmt.Print("\n")
		// A: this is A.
		// B: true
		// C: 99
		// D: this is D.
	}
}
カテゴリー:Go