Go Reflect - GO反射相关内容点

AI 摘要: 本文介绍了Go语言中接口的几个注意点,包括静态类型、方法集合、空接口、断言和接口值的组成等。

反射三定律

参考: https://go.dev/blog/laws-of-reflection

接口几点注意

  1. Go是静态类型,即使是具有相同的基础类型,如果不进行转换,不能直接赋值
  2. 接口为方法集合
  3. 特殊的接口:空接口 - interface{},表示空方法集合,所有类型值都是该接口的接口值
  4. 接口支持断言成指定类型
  5. 接口值包含两部分内容: 值内容、接口所属的类型,一个重要的细节是接口内的对总是具有形式**(值,具体类型)**

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// 下面两个在reflect反射内部
type MyInt int
var i int
var j MyInt

// 接口为访问集合
var r io.Reader
r = os.Stdin
r = bufio.NewReader(r)
r = new(bytes.Buffer)
// and so on

// 空接口
var x interface{}

// 接口断言
var w io.Writer
w = r.(io.Writer)

反射无法断言自定义类型

反射三定律内容

  1. 反射从接口值转到反射对象: reflect.TypeOf()reflect.ValueOf() ,得到是接口类型和值
1
2
3
4
5
6
7
8
9
// 类型断言
x := 3.14
t.Logf("type=>%+v, val=>%+v", reflect.TypeOf(x), reflect.ValueOf(x))
t.Logf("string => %s", reflect.ValueOf(x).String())

// 
type MyInt int
var x MyInt = 7
v := reflect.ValueOf(x)