Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Alias ​​Jenis Langsung Tidak Mewarisi Kaedah dalam Go?

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

Linda Hamilton
Linda Hamiltonasal
2024-11-19 09:54:03133semak imbas

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
}

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!

Kenyataan:
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