反射三定律
参考: https://go.dev/blog/laws-of-reflection
接口几点注意
- Go是静态类型,即使是具有相同的基础类型,如果不进行转换,不能直接赋值
- 接口为方法集合
- 特殊的接口:空接口 -
interface{}
,表示空方法集合,所有类型值都是该接口的接口值 - 接口支持断言成指定类型
- 接口值包含两部分内容: 值内容、接口所属的类型,一个重要的细节是接口内的对总是具有形式**(值,具体类型)**
示例
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)
|
反射无法断言自定义类型
反射三定律内容
- 反射从接口值转到反射对象:
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)
|