Рассмотрим следующий фрагмент кода:
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) я понимаю, что второй фрагмент кода должен скомпилироваться, а преобразование типа должно произойти сбой во время выполнения.
Есть ли разница между этими 2 фрагментами;не являются ли x
и y
типа интерфейса (разные интерфейсы)? И почему секунда терпит неудачу во время компиляции?
Исходя из фона C ++, это очень похоже на объединение static_assert
(время компиляции) и assert
(время выполнения) в одно утверждение типа,что выглядит немного странно.