请考虑以下代码段:
package main
import "fmt"
type Interface interface {
Fun()
}
type Int int
func (Int) Fun() {}
func main() {
var x interface{}
x = Int(42)
if _, ok := x.(int); !ok {
fmt.Println("type assertion fails")
}
// why do the lines below fail to compile?
var y Interface
y = Int(42)
if _, ok := y.(int); !ok {
fmt.Println("type assertion fails")
}
}
第一种类型的断言按预期执行。但是,在第二种情况下,类型断言是在编译时执行的(换句话说,程序不会编译)
不可能的类型断言: int没有实现接口(缺少Fun方法)
通过阅读“ Go编程语言”(第206页),我的理解是第二个代码段应该编译,并且类型转换应该在运行时失败。
两个摘要之间是否有任何区别? x
和y
都不都是接口类型(不同的接口)吗?为什么秒在编译时失败?
从C ++的背景来看,这很像将static_assert
(编译时)和assert
(运行时)组合成单个类型断言,这看起来有点奇怪。
答案 0 :(得分:1)
根据规格:
更确切地说,如果T不是接口类型,则x。(T)断言x的动态类型与T的类型相同。在这种情况下,T必须实现x的(接口)类型。否则类型断言无效,因为x不可能存储类型T的值。如果T是接口类型,则x。(T)断言x的动态类型实现了接口T。
https://golang.org/ref/spec#Type_assertions
因此,由于 for i in range(1,6):
f=open('100K_Array_{:d}.txt'.format(i), 'r')
alist = f.readlines()
quickSort(alist)
print(alist)
f.close()
不是接口类型,因此预期编译失败。并且它没有实现int
(x
)。