gpt4 book ai didi

reflection - 在 go 反射包中,调用 Value.Kind() 是 Value.Type().Kind() 的语法糖吗?

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:42 35 4
gpt4 key购买 nike

两个reflect.Type接口(interface)和reflect.Value type 实现相同的 Kind() 方法签名,假设我们有一些值对象 v := reflect.ValueOf(x)

v.Kind() 只是调用 v.Type().Kind() 吗?

最佳答案

它们包含相同的值,但似乎指的不是同一件事:

Type 通常由未导出的结构 rtype 实现(通过 TypeOf),而 Value 包含一个*rtype 并扩展 flag,它本身是 Kind 的简化形式:

// flag holds metadata about the value.
// The lowest bits are flag bits:
// - flagRO: obtained via unexported field, so read-only
// - flagIndir: val holds a pointer to the data
// - flagAddr: v.CanAddr is true (implies flagIndir)
// - flagMethod: v is a method value.
// The next five bits give the Kind of the value.
// This repeats typ.Kind() except for method values.
// The remaining 23+ bits give a method number for method values.
// If flag.kind() != Func, code can assume that flagMethod is unset.
// If typ.size > ptrSize, code can assume that flagIndir is set.

当获取 ValueOf 时:

// ValueOf returns a new Value initialized to the concrete value
// stored in the interface i. ValueOf(nil) returns the zero Value.
func ValueOf(i interface{}) Value {
[...]
// For an interface value with the noAddr bit set,
// the representation is identical to an empty interface.
eface := *(*emptyInterface)(unsafe.Pointer(&i))
typ := eface.typ


/** Flag is built from the type, then kept separate (my comment) */

fl := flag(typ.Kind()) << flagKindShift
if typ.size > ptrSize {
fl |= flagIndir
}
return Value{typ, unsafe.Pointer(eface.word), fl}
}

所以当你得到一个值的种类时(记住它扩展了它的标志):

func (v Value) Kind() Kind {
return v.kind()
}

func (f flag) kind() Kind {
return Kind((f >> flagKindShift) & flagKindMask)
}

获取类型的种类时:(Type是一个接口(interface),通常由*rtype实现)

func (t *rtype) Kind() Kind { return Kind(t.kind & kindMask) }

所以虽然它们在大多数情况下看起来是相等的,v.Kind() 不是 v.Type().Kind()

关于reflection - 在 go 反射包中,调用 Value.Kind() 是 Value.Type().Kind() 的语法糖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20571822/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com