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.
}
}