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 或字符 Ö? 是否所有值都与代表其类型的字节秘密传递?
墨色风雨
相关分类