猿问

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

Go 和 Scala 都提供了在运行时检查类型的方法:


斯卡拉:


class A

class B extends A


val a: A = new A // static type: A dynamic type: A

val ab: A = new B // static type: A dynamic type: B

val b: B = new B // static type: B dynamic type: B


def 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 main


import (

    "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 或字符 Ö? 是否所有值都与代表其类型的字节秘密传递?


侃侃无极
浏览 145回答 1
1回答

墨色风雨

在 Scala 中,每个对象都有一个指向它的类的指针。当你调用thing一个基本参数(Int,Char等等),它会自动装箱为对象(java.lang.Integer,java.lang.Character,等)。这场比赛对Int你的代码实际上被转换成对抗比赛Integer。在 Go 中,类型不存储在结构中,而是存储在接口值中:接口值表示为一个双字对,给出一个指向存储在接口中的类型信息的指针和一个指向相关数据的指针。将 b 分配给 Stringer 类型的接口值会设置接口值的两个字。因此,当您调用printTypeOf(whatever),时,它会whatever被转换为 ,interface {}并且它的类型与whatever它本身一起存储在这个新值中。
随时随地看视频慕课网APP

相关分类

Go
我要回答