- func可以当作关键字使用,比如在函数传入函数参数时,func和正常情况下的int形参是一个位置。
- 传入函数参数时,由于函数参数也需要参数,那个参数也需要传入,或者新写一个也行
- 构造函数尽量用指针,减少复制产生的内存消耗
- 反射中 elem()函数用来解引用,如果要修改“反射类型对象”,其值必须是“可写的”(settable)
- 结构体的字段都是首字母大写的(暴露到外部),因为struct中只有暴露到外部的字段才是“可写的”。
- 反射的用法(每多加一层指针,就要多取一次地址)
package main
import (
"fmt"
"reflect"
)
type Config struct{
Address string `ini:"address"`
Port string `ini:"port"`
Protocol string `ini:"protocol"`
}
func main() {
myConfig := new(Config)
myConfig.Address = "1.1.1.1"
configType := reflect.TypeOf(myConfig)
configTypeElem := configType.Elem()
count := configTypeElem.NumField()
fieldName := configTypeElem.Field(0).Name
tagName := configTypeElem.Field(0).Tag
tagType := configTypeElem.Field(0).Type
configValue := reflect.ValueOf(myConfig)
configValueElem := configValue.Elem()
configValueElem.Field(0).SetString("input")
fmt.Println(count)
fmt.Println(fieldName)
fmt.Println(tagName)
fmt.Println(tagType)
}
结构体(struct)https://www.jb51.net/article/90021.htm
在前面的例子中,变量 v 本身并不是指针,它只是从指针衍生而来。把反射应用到结构体时,常用的方式是 使用反射修改一个结构体的某些字段。只要拥有结构体的地址,我们就可以修改它的字段。
下面通过一个简单的例子对结构体类型变量 t 进行分析。
首先,我们创建了反射类型对象,它包含一个结构体的指针,因为后续会修改。
然后,我们设置 typeOfT 为它的类型,并遍历所有的字段。
注意:我们从 struct 类型提取出每个字段的名字,但是每个字段本身也是常规的 reflect.Value 对象。
type T struct {
A int
B string
}
t := T{23, "skidoo"}
s := reflect.ValueOf(&t).Elem()
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
fmt.Printf("%d: %s %s = %v\n", i,
typeOfT.Field(i).Name, f.Type(), f.Interface())
}