I need to generate a Form from the struct below. I need to have access to every field and type on the Doc to generate the Form. My problem is to access the struct fields when they are on an slice.
This is the code
package main
import (
"fmt"
"net/url"
"time"
"reflect"
"strings"
"strconv"
)
type TestStruct struct {
Children22 struct {// I can acess this one ( see code)
ID string
Name string
}
Children23 []struct { // this is not struct it is slice of sruct
ID1 string // I would like to access this one
Name1 string
}
Nest struct {
Children []struct { // I would like to get to this one too
ID2 string
Name2 string
}
}
}
func main() {
var t1 TestStruct
t1.InterfaceStruct = &InterfaceStruct{}
main := reflect.ValueOf(&t1)
err := GetField(main)
if err != nil {
fmt.Println("Error lev 1 = ", err)
}
}
func GetField ( f reflect.Value ) error {
if f.Kind() != reflect.Ptr {
fmt.Println("Error not a pointer ")
}
val := f.Elem()
lenght := val.NumField()
for i := 0; i < lenght; i++ {
typefield := val.Type().Field(i)
elementType := val.Type().Field(i).Type
type_filed := val.Type().Field(i).Type.String()
elemKind := elementType.Kind()
fmt.Println("typefield.Name = ", typefield.Name)
fmt.Println("elementType = ", elementType)
fmt.Println("what kind =", elemKind )
if elemKind == reflect.Slice{
fmt.Println("is a Slice")
fmt.Println(" Slice type =", val.Field(i).Addr().Elem().Type() )
// what kind of slice
if strings.Contains(type_filed ,"struct") {
// I do not know how to address the struct inside the slice
}
}
if elemKind == reflect.Struct { // check first for time and URL are Struct
if type_filed != "time.Time" && type_filed != "url.URL" {
fmt.Println("is a struct ")
//pass this to function recursive as reflect.Value
newSt := val.Field(i).Addr() // this works fine
err := GetField(newSt) // recall the func to get the struct
if err != nil {
fmt.Println("Error = ", err)
}
}
}
if elemKind == reflect.Map {
fmt.Println("is a Map")
}
fmt.Println(" ")
}
return nil
}