【golang笔记】go_反射几点注意事项(31)

Page content

这一篇简单的整理了golang 反射几点注意事项 相关的内容。

1.reflect.Value.Kind,获取变量的类别,返回的是一个常量

type Kind uint

Kind代表Type类型值表示的具体分类。零值表示非法分类。

const (
    Invalid Kind = iota
    Bool
    Int
    Int8
    Int16
    Int32
    Int64
    Uint
    Uint8
    Uint16
    Uint32
    Uint64
    Uintptr
    Float32
    Float64
    Complex64
    Complex128
    Array
    Chan
    Func
    Interface
    Map
    Ptr
    Slice
    String
    Struct
    UnsafePointer
)

2.Kind的范围比Type大

var num int = 10 // num的 type是 int Kind也是 int
var stu Student // stu的 type是 pkg.Student Kind是 struct

3.按需求 变量 <-> interface{} <-> reflect.Value 之间相互转换

value := reflect.ValueOf(interface{})
num := interface{}.(int)

4.使用反射的方式获取凉凉的值,需要做数据类型匹配,要不会报Panic

if reflect.TypeOf(value).Kind() == reflect.Int {
  num := value.(int)
}

5.通过反射修改变量值,使用Setxx方法需要传指针类型,获取元素使用reflect.Value.Elem()

package main

import (
 "fmt"
 "reflect"
)

func testInt(b interface{}) {
 val := reflect.ValueOf(b)
 fmt.Printf("val type=%T\n", val) // val type=reflect.Value

 val.Elem().SetInt(110)
 fmt.Printf("val=%v\n", val) // val=0xc0000140b8
}

func main() {
 var num int = 20
 testInt(&num)
 fmt.Println("num =", num) //num = 110
}

6.reflect.Value.Elem() 的实际效果

package main

import (
 "fmt"
 "reflect"
)

func main() {
 var num int = 10
 fn := reflect.ValueOf(&num)
 fn.Elem().SetInt(20)
 fmt.Printf("%+v\n", num)

 var num1 = 100
 var b *int = &num1
 *b = 200
 fmt.Printf("%+v\n", num1)
}

欢迎大家的意见和交流

email: li_mingxie@163.com