GO语言练习:反射

列举几个反射的例子:1)简单类型反射,2)复杂类型反射,3)对反射回来的数据的可修改属性

1、简单类型反射

  1.1)代码

复制代码
package main

import (
    "fmt"
    "reflect"
)

func main() {
    var x float64 = 3.4
    v := reflect.ValueOf(x)
    fmt.Println("type :", v.Type())
    fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
    fmt.Println("value:", v.Float())
}
复制代码

  1.2)运行结果

$ go run reflect.go 
type : float64
kind is float64: true
value: 3.4

 2、复杂类型反射

  2.1)代码

复制代码
 1 package main
 2 
 3 import (
 4     "fmt"
 5     "reflect"
 6 )
 7 
 8 type T struct {
 9     A int
10     B string
11 }
12 
13 func main () {
14     t := T{203, "mh203"}
15     s := reflect.ValueOf(&t).Elem()
16     typeOfT := s.Type()
17     for i := 0; i < s.NumField(); i++ {
18         f := s.Field(i)
19         fmt.Printf("%d: %s %s = %v\n", i,
20         typeOfT.Field(i).Name, f.Type(), f.Interface())
21     }
22 }
复制代码

  2.2)运行结果

$ go run structreflect.go 
0: A int = 203
1: B string = mh203

3、通过反射获得的变量的可设置属性

  3.1)代码实例

复制代码
 1 package main
 2 
 3 import (
 4     "fmt"
 5     "reflect"
 6 )
 7 
 8 func testA() {
 9     var x float64 = 3.4
10     v := reflect.ValueOf(x)
11     if(true == v.CanSet()) {
12         fmt.Println("v is setable")
13         //v.Set(4.1)
14     } else {
15         fmt.Println("v is not setable")
16     }
17 }
18 
19 func testB() {
20     var x float64 = 3.4
21     p := reflect.ValueOf(&x)
22     fmt.Println("type of p:", p.Type())
23     fmt.Println("settablitty of p :", p.CanSet())
24 
25     v := p.Elem()
26     fmt.Println("settablitty of v:", v.CanSet())
27 
28     v.SetFloat(7.1)
29     fmt.Println(v.Interface())
30     fmt.Println(x)
31 }
32 
33 func main() {
34     testA()
35     testB()
36 }
复制代码

  3.2)运行结果

$ go run set.go 
v is not setable
type of p: *float64
settablitty of p : false
settablitty of v: true
7.1
7.1

 

posted @   fengbohello  阅读(602)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示