![]()
package main
import (
"fmt"
"reflect"
)
type Secret struct {
Username string
Password string
}
type Record struct {
Field1 string
Field2 float64
Field3 Secret
}
func main() {
A := Record{"String value", -12.123, Secret{"Mihalis", "Tsoukalos"}}
r := reflect.ValueOf(A)
fmt.Println("String value:", r.String())
iType := r.Type()
fmt.Printf("i Type: %s\n", iType)
fmt.Printf("The %d fields of %s are\n", r.NumField(), iType)
for i := 0; i < r.NumField(); i++ {
fmt.Printf("\t%s ", iType.Field(i).Name)
fmt.Printf("\twith type: %s ", r.Field(i).Type())
fmt.Printf("\tand value _%v_\n", r.Field(i).Interface())
// Check whether there are other structures embedded in Record
// k := reflect.TypeOf(r.Field(i).Interface()).Kind()
k := r.Field(i).Kind()
// Need to convert it to string in order to compare it
if k.String() == "struct" {
fmt.Println(r.Field(i).Type())
}
// Same as before but using the internal value
if k == reflect.Struct {
fmt.Println(r.Field(i).Type())
}
}
}
zzh@ZZHPC:/zdata/Github/ztest$ go run main.go
String value: <main.Record Value>
i Type: main.Record
The 3 fields of main.Record are
Field1 with type: string and value _String value_
Field2 with type: float64 and value _-12.123_
Field3 with type: main.Secret and value _{Mihalis Tsoukalos}_
main.Secret
main.Secret
zzh@ZZHPC:/zdata/Github/ztest$ go run main.go
String value: <main.Record Value>
i Type: main.Record
The 3 fields of main.Record are
Field1 with type: string and value _String value_
Field2 with type: float64 and value _-12.123_
Field3 with type: main.Secret and value _{Mihalis Tsoukalos}_
main.Secret
main.Secret
![]()
package main
import (
"fmt"
"reflect"
)
type T struct {
F1 int
F2 string
F3 float64
}
func main() {
A := T{1, "F2", 3.0}
fmt.Println("A:", A)
r := reflect.ValueOf(&A).Elem()
fmt.Println("String value:", r.String())
typeOfA := r.Type()
for i := 0; i < r.NumField(); i++ {
f := r.Field(i)
tOfA := typeOfA.Field(i).Name
fmt.Printf("%d: %s %s = %v\n", i, tOfA, f.Type(), f.Interface())
k := f.Kind()
if k == reflect.Int {
r.Field(i).SetInt(-100)
} else if k == reflect.String {
r.Field(i).SetString("Changed!")
}
}
fmt.Println("A:", A)
}
zzh@ZZHPC:/zdata/Github/ztest$ go run main.go
A: {1 F2 3}
String value: <main.T Value>
0: F1 int = 1
1: F2 string = F2
2: F3 float64 = 3
A: {-100 Changed! 3}
![]()
![]()