Go 和 Scala 都提供了在运行时检查类型的方法:斯卡拉:class Aclass B extends Aval a: A = new A // static type: A dynamic type: Aval ab: A = new B // static type: A dynamic type: Bval b: B = new B // static type: B dynamic type: Bdef thing(x: Any): String = x match { case t: Int => "Int" case t: A => "A" case t: B => "B" case t: String => "String" case _ => "unknown type"}去:package mainimport ( "fmt" "reflect")struct A { field1 int field2 string}func printTypeOf(t interface{}) { fmt.Println(reflect.TypeOf(t))}func main() { i := 234234 // int s := "hello world" // string p := &A{3234234, "stuff"} // *A fmt.Print("The type of i is: ") printTypeOf(i) fmt.Print("The type of s is: ") printTypeOf(s) fmt.Print("The type of p is: ") // pass a pointer printTypeOf(p) fmt.Print("The type of the reference of p is: ") // pass a value printTypeOf(*p)}这在内部究竟是如何工作的?我假设对于结构和类,对象的类型存储在一个隐藏字段中(所以 golang 中的结构实际上是 struct { field1 int field2 string type type }。但是到底如何才能给函数 11010110 并知道它是否是一个指向内存地址 214 的指针、整数 214 或字符 Ö? 是否所有值都与代表其类型的字节秘密传递?
1 回答
墨色风雨
TA贡献1853条经验 获得超6个赞
在 Scala 中,每个对象都有一个指向它的类的指针。当你调用thing
一个基本参数(Int
,Char
等等),它会自动装箱为对象(java.lang.Integer
,java.lang.Character
,等)。这场比赛对Int
你的代码实际上被转换成对抗比赛Integer
。
在 Go 中,类型不存储在结构中,而是存储在接口值中:
接口值表示为一个双字对,给出一个指向存储在接口中的类型信息的指针和一个指向相关数据的指针。将 b 分配给 Stringer 类型的接口值会设置接口值的两个字。
因此,当您调用printTypeOf(whatever)
,时,它会whatever
被转换为 ,interface {}
并且它的类型与whatever
它本身一起存储在这个新值中。
- 1 回答
- 0 关注
- 144 浏览
添加回答
举报
0/150
提交
取消