Setakat yang saya faham, go ditaip secara statik dan biasanya tidak melakukan penukaran jenis tersirat. Oleh itu, pemalar tanpa pengisytiharan jenis eksplisit adalah tertakluk kepada keperluan pada penggunaan pertama.
Jadi, dalam coretan kod di bawah, saya mahu n
是 float64
,因为这就是 math.sin
所期望的。但是当打印出反射类型时,我看到了 int
.
package main import ( "fmt" "math" "reflect" ) func main() { const n = 5000 // No explict type // fmt.Println(reflect.TypeOf(n)) // this would print "int" fmt.Println(math.Sin(n)) // math.Sin expects a float64 fmt.Println(reflect.TypeOf(n)) // print "int" }
Apa yang berlaku di sini? n
实际上有隐式 int 类型吗?或者反射不会显示这样的实际类型情况?我不认为 math.sin
sedang menaip hujahnya kerana jika saya menyatakan jenis eksplisit, pengkompil akan menimbulkan ralat.
[Jenis pemalar yang tidak ditaip] adalah berdasarkan keperluan pada penggunaan pertama.
Di sinilah anda silap. Satu jenis dipilih secara bebas untuk setiap kegunaan.
math.Sin memerlukan hujah float64, jadi pengkompil mesti memilih float64 di sini.
reflect.TypeOf mengambil hujah antara muka{}, jadi pengkompil bebas untuk memilih sebarang jenis angka (kerana mereka semua melaksanakan antara muka kosong). Jenis integer lalai dipilih di sini: int.
Atas ialah kandungan terperinci Bagaimanakah refleksi jenis untuk jenis tersirat berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!