当前位置: 首页 > news >正文

拖拉建网站大连网络营销公司

拖拉建网站,大连网络营销公司,网站关于我们什么意思,建设部网站投诉核查企业名单Golang 进阶5—— 反射 注意,该文档只适合有编程基础的同学,这里的go教程只给出有区别的知识点 反射: 反射可以在运行时动态获取变量的各种信息, 比如变量的类型、 类别等信息。如果是结构体变量,还可以获取结构体本…

Golang 进阶5—— 反射

注意,该文档只适合有编程基础的同学,这里的go教程只给出有区别的知识点

反射:

  • 反射可以在运行时动态获取变量的各种信息, 比如变量的类型、 类别等信息。
  • 如果是结构体变量,还可以获取结构体本身的信息(结构体的字段、方法)。
  • 通过反射, 可以修改变量的值,可以调用关联的方法。
  • 使用反射, 需要import(“reflect”)
1.1 main函数
package mainimport ("fmt""reflect"
)// 利用一个函数, 函数的参数定义为空接口
// 空接口没有任何方法,所以可以理解为所有类型都实现了空接口
// 也可以理解为我们可以把任何一种类型赋值给空接口
func testReflect (data interface{}) {// 1、 调用 TypeOf函数, 返回reflect.Type 类型的数据fmt.Println("data type is ", reflect.TypeOf(data))// 2、 调用 ValueOf函数, 返回reflect.Value 类型的数据reVal := reflect.ValueOf(data)fmt.Println("data value is ", reVal)// 3、 如果要获取具体类型的值, 可以调用 Int 方法sum := 100 + reVal.Int()fmt.Println("sum is ", sum)// 4、 reVal 转成空接口i2  := reVal.Interface()fmt.Println("i2 is ", i2)// 5、类型断言n := i2.(int)n2 := n + 200fmt.Println("n2 is ", n2)fmt.Println("i2 type is ", reflect.TypeOf(i2))
}
1.2 输出结果
(base) PS E:\Goproject\src\gocode\testproject03> go run .\main\main.go
data type is  int
data value is  10
sum is  110
i2 is  10
n2 is  210
i2 type is  int
1.3 结构体情况
import ("fmt""reflect"
)type Student struct {Name stringAge int
}// 利用一个函数, 函数的参数定义为空接口
// 空接口没有任何方法,所以可以理解为所有类型都实现了空接口
// 也可以理解为我们可以把任何一种类型赋值给空接口
func testReflect (data interface{}) {// 1、 调用 TypeOf函数, 返回reflect.Type 类型的数据fmt.Println("data type is ", reflect.TypeOf(data))// 2、 调用 ValueOf函数, 返回reflect.Value 类型的数据reVal := reflect.ValueOf(data)fmt.Println("data value is ", reVal)// 3、 reVal 转成空接口i2 := reVal.Interface()fmt.Println("i2 is ", i2)if s, ok := i2.(Student); ok {fmt.Println("i2 is student:", s.Name)} else {fmt.Println("i2 is not a student")}
}func main () {stu1 := Student{"xiaoxiao", 18}testReflect(stu1)
}
1.4 输出结果
(base) PS E:\Goproject\src\gocode\testproject03> go run .\main\main.go
data type is  main.Student
data value is  {xiaoxiao 18}
i2 is  {xiaoxiao 18}
i2 is student: xiaoxiao
1.5 获取变量类别
import ("fmt""reflect"
)type Student struct {Name stringAge int
}// 利用一个函数, 函数的参数定义为空接口
// 空接口没有任何方法,所以可以理解为所有类型都实现了空接口
// 也可以理解为我们可以把任何一种类型赋值给空接口
func testReflect (data interface{}) {// 1、 调用 TypeOf函数, 返回reflect.Type 类型的数据reType := reflect.TypeOf(data)fmt.Println("data type is ", reType)// 2、 调用 ValueOf函数, 返回reflect.Value 类型的数据reVal := reflect.ValueOf(data)fmt.Println("data value is ", reVal)// 3、 获取变量的类别(大范围)k1 := reVal.Kind()fmt.Println("data kind is ", k1)k2 := reType.Kind()fmt.Println("data kind is ", k2)// 4、 获取变量的类型 (小范围)i2 := reVal.Interface()if n, ok := i2.(Student); ok {fmt.Println("n is ", n)} else {fmt.Println("n is not Student")}}func main () {stu1 := Student{"xiaoxiao", 18}testReflect(stu1)
}
1.6 输出结果
(base) PS E:\Goproject\src\gocode\testproject03> go run .\main\main.go
data type is  main.Student
data value is  {xiaoxiao 18}
data kind is  struct
data kind is  struct
n is  {xiaoxiao 18}
1.7 对结构体操作
// 1. 定义结构体
type Student struct {Name stringAge  int
}// 2. 给结构体绑定方法
func (stu Student) Print() {fmt.Print("调用了Print方法")fmt.Println(stu)
}func (stu Student) GetSum(n1, n2 int) int {return n1 + n2
}func (stu Student) Set(name string, age int) {stu.Name = namestu.Age = age
}func testReflect(data interface{}) {reVal := reflect.ValueOf(data)// 检查 data 是否是指针,并获取指向的值if reVal.Kind() == reflect.Ptr {reVal = reVal.Elem()}fmt.Println(reVal)// 获取结构体中字段的数量n1 := reVal.NumField()fmt.Println("字段的数量:", n1)for i := 0; i < n1; i++ {// 输出字段fmt.Printf("字段 %d 的名字是 %s, 对应的值为 %v \n", i, reVal.Type().Field(i).Name, reVal.Field(i))}// 获取结构体的方法数量n2 := reVal.NumMethod()fmt.Println("方法的数量:", n2)// 输出方法for i := 0; i < n2; i++ {// 输出方法fmt.Printf("方法 %d 的名字是 %s \n", i, reVal.Type().Method(i).Name)}// 调用方法, 调用的方法首字母必须大写reVal.MethodByName("Print").Call(nil)// 调用GetSum方法// 定义Value切片var params []reflect.Valueparams = append(params, reflect.ValueOf(10))params = append(params, reflect.ValueOf(20))sum := reVal.MethodByName("GetSum").Call(params)fmt.Println("sum = ", sum[0])
}func main() {stu := Student{Name: "Tom", Age: 18}testReflect(stu) // 传入 stu 的指针
}
1.8 输出结果
(base) PS E:\Goproject\src\gocode\testproject03> go run .\main\main.go
{Tom 18}
字段的数量: 2
字段 0 的名字是 Name, 对应的值为 Tom
字段 1 的名字是 Age, 对应的值为 18
方法的数量: 3
方法 0 的名字是 GetSum
方法 1 的名字是 Print
方法 2 的名字是 Set
调用了Print方法{Tom 18}
sum =  30
1.9 改值
import ("fmt""reflect"
)// 1. 定义结构体
type Student struct {Name stringAge  int
}// 2. 给结构体绑定方法
func (stu Student) Print() {fmt.Print("调用了Print方法")fmt.Println(stu)
}func (stu Student) GetSum(n1, n2 int) int {return n1 + n2
}func (stu Student) Set(name string, age int) {stu.Name = namestu.Age = age
}func testReflect(data interface{}) {reVal := reflect.ValueOf(data)// 通过setInt方法修改值n := reVal.Elem().NumField()fmt.Println("结构体中字段个数为:", n)reVal.Elem().Field(0).SetString("Jack")reVal.Elem().Field(1).SetInt(30)
}func main() {stu := Student{Name: "Tom", Age: 18}testReflect(&stu) // 传入 stu 的指针fmt.Println(stu)
}
1.10 输出结果
(base) PS E:\Goproject\src\gocode\testproject03> go run .\main\main.go
结构体中字段个数为: 2
{Jack 30}
http://www.15wanjia.com/news/190823.html

相关文章:

  • 榆社网站建设见网页制作的公司网站
  • 国外移动端网站模板常州网站建设网站
  • 微官网和移动网站区别吗网络营销平台搭建方案网站
  • 网站上的按钮怎么做婚庆公司网站建设总结报告
  • html网站设计实例代码用vue做网站的实例
  • 简单的网站开发流程图网站优化协议
  • 做一个网站设计要多少钱黔西南州建设银行网站
  • 站长资讯wordpress videoplus
  • 青岛优化网站多少钱网站开发难度和小程序开发难度
  • 用自己的身份做网站备案在线做ps是什么网站
  • 织梦笑话娱乐网站源码2w数据+36条采集规则江苏好的建筑公司官网
  • 网站宣传平台永久网站推广
  • 网站关键词引流找网站推广
  • 网站 做 专家问答曙光建设有限公司网站
  • 手机版网站模板 免费下载常州网站推
  • 做网站用什么软件语言网站搭建和网站开发
  • 建设营销型网站模板想找公司做网站
  • 网站域名设置C 建设个人网站
  • 微信如何开小程序烟台seo网站推广费用
  • 网站排名如何做郑州港区建设投资公司网站
  • 徐州建设网站公司文大侠seo
  • ftps 网站怎么做简述商务网站建设的步骤
  • 公众号视频网站开发他达拉非是什么
  • 重庆网站推广机构网站前置审批表
  • linux系统如何做网站photoshop网站设计
  • 平湖网站建设公司克微网站 小程序 区别
  • ps彩屏做的好的网站务川自治县建设局网站
  • 国内优秀网站网址免费推广营销网站
  • 做设计接外快在哪个网站查服务器ip地址
  • html做网站的代码网站建设数据库的购买