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或字符Ö?是否所有值都与一个代表其类型的字节秘密传递?
答案 0 :(得分:2)
在Scala中,每个对象都有一个指向其类的指针。当您使用原始参数(thing
,Int
等)致电Char
时,系统会自动将其设置为对象(java.lang.Integer
,java.lang.Character
等。 )。您代码中与Int
的匹配实际上会转换为与Integer
的匹配。
在Go中,类型不存储在结构中,而是存储在接口值中:
因此,当您致电printTypeOf(whatever)
时,whatever
会转换为interface {}
,其类型会与whatever
本身一起存储在此新值中。