Rumah > Artikel > pembangunan bahagian belakang > Mengapa Alias Jenis Langsung Tidak Mewarisi Kaedah dalam Go?
Memahami Jenis Alias dalam Go
Dalam Go, taip alias boleh mengelirukan. Kod berikut menunjukkan ini:
package main import ( "fmt" "time" ) type dur struct { time.Duration } type durWithMethods dur type durWithoutMethods time.Duration func main() { var d durWithMethods // works !! fmt.Println(d.String()) var dWM durWithoutMethods fmt.Println(dWM.String()) // doesn't compile }
Mengapa alias langsung durWithoutMethods tidak mewarisi sebarang kaedah, tidak seperti durWithMethods?
Taip Pengisytiharan dan Alias
Untuk memahami perkara ini, kita perlu membezakan antara pengisytiharan jenis dan jenis alias. Pengisytiharan jenis mencipta jenis baharu, menanggalkan semua kaedah daripada jenis asasnya. Alias jenis, sebaliknya, hanya mengikat pengecam baharu kepada jenis sedia ada.
Resolusi Kaedah
Dalam kes durWithMethods, durWithMethods jenis baharu ialah dicipta dengan dur sebagai jenis asasnya. Semasa dur membenamkan masa. Tempoh, kaedah masa. Tempoh dinaikkan kepada dur. Oleh itu, d.String() boleh dipanggil menggunakan trengkas d.Duration.String().
Pelucutan Kaedah
Walau bagaimanapun, dalam durWithoutMethods, alias langsung masa. Tempoh, semua kaedah dilucutkan. Memandangkan Duration.String() ialah kaedah masa.Duration, ia tidak diwarisi oleh durWithoutMethods.
Alias Jenis Benar
Alias jenis benar, sebaliknya tangan, dilambangkan menggunakan tanda =:
type sameAsDuration = time.Duration
Ini mencipta alias untuk masa. Tempoh tanpa kaedah pelucutan. Oleh itu, sad.String() boleh dipanggil sama dengan d.String().
Atas ialah kandungan terperinci Mengapa Alias Jenis Langsung Tidak Mewarisi Kaedah dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!