为什么类型转换在编译时失败?

时间:2019-10-31 22:47:09

标签: go

请考虑以下代码段:

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页),我的理解是第二个代码段应该编译,并且类型转换应该在运行时失败。

两个摘要之间是否有任何区别? xy都不都是接口类型(不同的接口)吗?为什么秒在编译时失败?

从C ++的背景来看,这很像将static_assert(编译时)和assert(运行时)组合成单个类型断言,这看起来有点奇怪。

1 个答案:

答案 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() 不是接口类型,因此预期编译失败。并且它没有实现intx)。