网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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())
}
}
}
}
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
]
[外链图片转存中…(img-qQqbmNpK-1715738738098)]
[外链图片转存中…(img-2BgYKv8N-1715738738098)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新