樓主剛開始學(xué)習(xí)使用go開發(fā)web項目, 在參考http://www.reibang.com/p/21376f5557d5?from=timeline&isappinstalled=0
文章的思路后, 發(fā)現(xiàn)無法檢查子結(jié)構(gòu)體.故進行了修改, 思路:
1.發(fā)現(xiàn)字段是子結(jié)構(gòu)體之后, 遞歸調(diào)用檢查函數(shù), 返回的結(jié)果err為nil則繼續(xù)檢查, 否則返回錯誤.
2.但是, 做了第1步后執(zhí)行不成功, 因為reflect.valueof函數(shù)需要的是一個結(jié)構(gòu)體的地址, 獲取到子結(jié)構(gòu)體已經(jīng)是一個interface的變量了, 取地址的類型為*interface.故做如下修改:定義子結(jié)構(gòu)體時, 類型定義為子結(jié)構(gòu)的地址類型.
有此引發(fā)了思考, 如下測試, 在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)
}