Mengapa Alias ​​Jenis dalam Go Berkelakuan Berbeza Apabila Ia Mewarisi daripada Jenis Terbenam?

Susan Sarandon
Lepaskan: 2024-11-22 11:56:12
asal
483 orang telah melayarinya

Why Do Type Aliases in Go Behave Differently When They Inherit from Embedded Types?

Menyelidiki Kerumitan Jenis Aliasing

Pertimbangkan coretan kod berikut:

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

Seseorang mungkin terfikir mengapa langsung alias masa. Tempoh (durWithoutMethods) tidak mewarisi sebarang kaedah, manakala jenis bersarang alias (durWithMethods) memberikan akses kepada mereka. Kekeliruan ini berpunca daripada perbezaan asas antara definisi jenis dan alias jenis.

Menentukan Jenis Baharu lwn. Menamakan Semula Yang Sedia Ada

Dalam Go, pengisytiharan jenis terbahagi kepada dua kategori: taip definisi dan taip alias. Taip definisi lahirkan jenis segar dengan membenamkan satu atau lebih jenis sedia ada. Mereka mewarisi kaedah hanya daripada jenis terbenam peringkat teratas, bukan daripada jenis bersarang.

Alias ​​jenis, sebaliknya, hanyalah singkatan yang mengikat pengecam baharu kepada jenis sedia ada. Mereka tidak mencipta jenis baharu, jadi jenis asas kekal tidak berubah. Sebarang kaedah yang dikaitkan dengan jenis asas masih boleh diakses dengan mudah melalui nama asal atau alias.

Memahami durWithMethods

Jenis durWithMethods memanjangkan jenis dur dengan berkesan dengan membenamkannya. Memandangkan dur membenamkan masa. Tempoh, ia mewarisi kaedah Tempoh, termasuk String(). Oleh itu, d.String() dalam kod berfungsi seperti yang diharapkan.

Menyingkap durWithoutMethods

Tidak seperti durWithMethods, durWithoutMethods ialah alias langsung masa.Duration. Ia tidak memanjangkan apa-apa, jadi ia hanya terdiri daripada masa primitif. Jenis tempoh. Kaedah masa. Tempoh tidak dipindahkan ke durWithoutMethods kerana ia adalah jenis yang berbeza dengan set kaedah tersendiri yang tersendiri. Oleh itu, dWM.String() tidak akan menyusun.

Atas ialah kandungan terperinci Mengapa Alias ​​Jenis dalam Go Berkelakuan Berbeza Apabila Ia Mewarisi daripada Jenis Terbenam?. 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