为了账号安全,请及时绑定邮箱和手机立即绑定

程序如何在运行时知道原语静态类型语言的类型

程序如何在运行时知道原语静态类型语言的类型

Go
侃侃无极 2021-12-27 18:22:15
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一个基本参数(IntChar等等),它会自动装箱为对象(java.lang.Integerjava.lang.Character,等)。这场比赛对Int你的代码实际上被转换成对抗比赛Integer

在 Go 中,类型不存储在结构中,而是存储在接口值中:

接口值表示为一个双字对,给出一个指向存储在接口中的类型信息的指针和一个指向相关数据的指针。将 b 分配给 Stringer 类型的接口值会设置接口值的两个字。

因此,当您调用printTypeOf(whatever),时,它会whatever被转换为 ,interface {}并且它的类型与whatever它本身一起存储在这个新值中。


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信