Mengapa Alias ​​Jenis Langsung Tidak Mewarisi Kaedah dalam Go?

Linda Hamilton
Lepaskan: 2024-11-19 09:54:03
asal
133 orang telah melayarinya

Why Doesn't a Direct Type Alias Inherit Methods in 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
}
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan