2024年最新golang基础教程(十八)、反射_golang教程(1),妈妈再也不用担心我找工作了

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

import (
“fmt”
“reflect”
)

func testBasic(i interface{}){
//i实际是一个指针
ptrValueOfI := reflect.ValueOf(i)
fmt.Println(ptrValueOfI.Kind())
//获取指针指向的真正的值
valueOfI := ptrValueOfI.Elem()
//为其更改值
valueOfI.SetInt(1000)
}

func main() {
n:=1
testBasic(&n)
fmt.Println(n)

}


结果:



ptr
1000


##### struct类型的属性修改


代码:



package main

import (
“fmt”
“reflect”
)

type Student struct {
Name string
Age int
}

func test(i interface{}){
//获取指针指向的真正的数值Value
valueOfI := reflect.ValueOf(i).Elem()
//获取对应的Type这个是用来获取属性方法的
typeOfI := valueOfI.Type()
//判断是否是struct
if typeOfI.Kind()!=reflect.Struct{
fmt.Println(“except struct”)
return
}
//获取属性的数量
numField := typeOfI.NumField()
//遍历属性,找到特定的属性进行操作
for i:=0;i< numField;i++{
//获得属性的StructField,次方法不同于Value中的Filed(这个返回的是Field)
field := typeOfI.Field(i)
//获取属性名称
fieldName := field.Name
fmt.Println(fieldName)
//找到名为Name的属性进行修改值
if fieldName==“Name”{
//改变他的值为jack
valueOfI.Field(i).SetString(“jack”)
}
}
}

func main() {
stu:=Student{Name:“susan”,Age:58}
test(&stu)
fmt.Println(stu.Name)
}


结果:



Name
Age
jack


### 四、引用类型修改


###### slice


代码:



package main

import (
“fmt”
“reflect”
)

func testSilce(i interface{}){
//获取对应的Value
valueOfI := reflect.ValueOf(i)
//获取Kind
fmt.Println("kind = ",valueOfI.Kind())
//获取slice长度
fmt.Println("len = ",valueOfI.Len())
//获取slice容量
fmt.Println("cap = ",valueOfI.Cap())
//获取指定位置的元素
indexValue := valueOfI.Index(0)
fmt.Println("index 0 = ",indexValue)
//为指定位置的元素赋值
indexValue.SetInt(300)
}

func main() {
s:=make([]int,10,20)
s[0]=200
//无需传入指针 因为其本身就是引用类型(slice map channel)
testSilce(s)
fmt.Println(s[0])

}


结果:



kind = slice
len = 10
cap = 20
index 0 = 200
300


###### map


代码:



package main

import (
“fmt”
“reflect”
)

func testMap(i interface{}){
valueOfI := reflect.ValueOf(i)
//获取长度
lenOfI := valueOfI.Len()
fmt.Println("len = ",lenOfI)
//获取所有的keys
keys := valueOfI.MapKeys()
for i:=0;i<len(keys);i++{
key := keys[i]
//获取对应的value
value := valueOfI.MapIndex(key)
fmt.Println(“key=”,key,“value=”,value)
num := value.Int()
//更改数值
//value.SetInt(num*num) 这种不行
valueOfI.SetMapIndex(key,reflect.ValueOf(int(num*num)))
}

}

func main() {
m:=make(map[string]int,10)
m[“a”]=1
m[“b”]=2
m[“c”]=3
testMap(m)
fmt.Println(m)
}


结果:



len = 3
key= a value= 1
key= b value= 2
key= c value= 3
map[a:1 b:4 c:9]


### 结构体反射执行方法


代码:



package main

import (
“fmt”
“reflect”
)

type Student struct {
Name string
Age int
}

func (s Student) Print() {
fmt.Println(“name=”, s.Name, “;age=”, s.Age)
}

func (Student) Plus(a int, b int) int {
return a + b
}

func testMethod(i interface{}){
//获取指针指向的值
valueOfI := reflect.ValueOf(i).Elem()
//获取对应的Type
typeOfI := valueOfI.Type()
//获取方法的数量
methodNum:= typeOfI.NumMethod()
fmt.Println(“methodNum=”,methodNum)
for i:=0;i<methodNum;i++{
//获取对应位置的方法
method := typeOfI.Method(i)
methodName := method.Name
fmt.Println(methodName)
if methodName ==“Plus”{
//调用Plus
m := valueOfI.MethodByName(methodName)
//声明一个切片
args:=make([]reflect.Value,2)
args[0]=reflect.ValueOf(78)
args[1]=reflect.ValueOf(22)
res := m.Call(args)
//遍历结果
for j:=0;j<len(res);j++ {
fmt.Println(methodName," ivoke result",j+1," : ",res[j].Int())
}

	}
}

}

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

]
[外链图片转存中…(img-qQqbmNpK-1715738738098)]
[外链图片转存中…(img-2BgYKv8N-1715738738098)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值