Golang初入编程-踩坑笔记(2)-函数式编程,反射

  1. func可以当作关键字使用,比如在函数传入函数参数时,func和正常情况下的int形参是一个位置。
  2. 传入函数参数时,由于函数参数也需要参数,那个参数也需要传入,或者新写一个也行
  3. 构造函数尽量用指针,减少复制产生的内存消耗
  4. 反射中 elem()函数用来解引用,如果要修改“反射类型对象”,其值必须是“可写的”(settable)
  5. 结构体的字段都是首字母大写的(暴露到外部),因为struct中只有暴露到外部的字段才是“可写的”。
  6. 反射的用法(每多加一层指针,就要多取一次地址)
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())
}
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页