tôi có thể chuyển đổi một int để một float64 như thế này:Go loại khẳng định chuyển đổi
var a int = 10
var b float64 = float64(a)
Liên quan đến gõ khẳng định, hiệu quả Go: 'Nguồn gốc loại hoặc phải được loại bê tông tổ chức bởi giao diện, hoặc loại giao diện thứ hai mà giá trị có thể được chuyển đổi thành '.
Với ý nghĩ đó, tại sao sau thất bại:
func foo(a interface{}) {
fmt.Println(a.(float64))
}
func main() {
var a int = 10
foo(a)
}
Điều này gây ra một panic: interface conversion: interface is int, not float64
.
Lưu ý rằng Go Spec nói:
'Đối với một biểu thức x kiểu giao diện và một loại T, khái niệm chính
x.(T)
khẳng định rằng x là không bằng không và rằng giá trị được lưu trữ trong x thuộc loại T. '
Điều gì mâu thuẫn với tuyên bố Hiệu quả Go nhưng dường như phù hợp hơn với những gì tôi thấy.
đồng ý, tuy nhiên theo đề xuất của thông điệp hoảng loạn thời gian chạy, thao tác thực sự là 'chuyển đổi giao diện', chứ không phải xác nhận. Sẽ tốt hơn nếu kiểu chuyển đổi này có thể xảy ra một cách tự nhiên. – Ferguzz
Bạn có thể thực hiện chuyển đổi loại. Bạn nghĩ gì về tự nhiên hơn? –
@Ferguzz: Chuyển khá rõ ràng trong tất cả các chuyển đổi của nó, có _no_ chuyển đổi ngầm hoặc tự động. Đây là một điều rất tốt. Các loại "chuyển đổi tự nhiên" hoàn toàn trái ngược với rõ ràng. – Volker