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

时间:2016-03-30 13:57:54

标签: scala reflection go types

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

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

1 个答案:

答案 0 :(得分:2)

在Scala中,每个对象都有一个指向其类的指针。当您使用原始参数(thingInt等)致电Char时,系统会自动将其设置为对象(java.lang.Integerjava.lang.Character等。 )。您代码中与Int的匹配实际上会转换为与Integer的匹配。

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

  

Interface values are represented as a two-word pair giving a pointer to information about the type stored in the interface and a pointer to the associated data. Assigning b to an interface value of type Stringer sets both words of the interface value.

因此,当您致电printTypeOf(whatever)时,whatever会转换为interface {},其类型会与whatever本身一起存储在此新值中。