楼主刚开始学习使用go开发web项目, 在参考https://www.jianshu.com/p/21376f5557d5?from=timeline&isappinstalled=0
文章的思路后, 发现无法检查子结构体.故进行了修改, 思路:
1.发现字段是子结构体之后, 递归调用检查函数, 返回的结果err为nil则继续检查, 否则返回错误.
2.但是, 做了第1步后执行不成功, 因为reflect.valueof函数需要的是一个结构体的地址, 获取到子结构体已经是一个interface的变量了, 取地址的类型为*interface.故做如下修改:定义子结构体时, 类型定义为子结构的地址类型.
有此引发了思考, 如下测试, 在go中:
1.变量有变量的类型
2.变量的值有值的类型.
3.变量的地址也有类型.如下对interface变量取地址和Car2的变量取地址, 两个地址仍然有自己的类型.
package main
import "fmt"
type Car1 struct {
S string
}
type Car2 struct {
A Car1
}
func main() {
a := Car2{Car1{"ss"}}
var b interface{}
b = a
c, _ := b.(Car2)
fmt.Println(&a, &b, &c)
fmt.Printf("%p %p", &a, &b)
}
image.png
网友评论