Jadual Kandungan
Kandungan soalan
workaround
Rumah pembangunan bahagian belakang Golang X tidak melaksanakan Y (...kaedah mempunyai penerima penunjuk)

X tidak melaksanakan Y (...kaedah mempunyai penerima penunjuk)

Feb 12, 2024 pm 11:27 PM

X 没有实现 Y(...方法有一个指针接收器)

editor php Xiaoxin akan membincangkan masalah tentang X gagal melaksanakan Y dalam artikel ini. Dalam masalah ini, kami menggunakan pendekatan penerima penunjuk. Melalui kaedah ini, kita dapat lebih memahami mengapa X tidak dapat mencapai Y dan mencari jalan untuk menyelesaikan masalah ini. Dalam kandungan berikut, kami akan membincangkan masalah ini secara terperinci dan memberikan beberapa penyelesaian.

Kandungan soalan

Sudah ada beberapa Soal Jawab mengenai soalan "X tidak melaksanakan Y (...kaedah mempunyai penerima penunjuk)", tetapi bagi saya mereka seolah-olah bercakap tentang perkara yang berbeza dan tidak terpakai kepada situasi khusus saya.

Jadi daripada membuat soalan itu sangat spesifik, saya akan menjadikannya luas dan abstrak - nampaknya terdapat beberapa situasi berbeza yang boleh menyebabkan ralat ini berlaku, bolehkah seseorang meringkaskannya?

Bagaimana untuk mengelakkan masalah ini dan jika ia berlaku, apakah kemungkinannya? terima kasih.

workaround

Ini kesilapan masa kompilasi berlaku apabila anda cuba menetapkan atau lulus (atau membuang) concretetype ke jenis antara muka; .

Ringkasan ringkas: Suatu tugasan kepada pembolehubahJenis antara muka adalah sah jika nilai yang ditetapkan melaksanakan antara muka yang ditetapkan. Jika set kaedah ialah superset antara muka, ia akan melaksanakannya. Set kaedah jenis penunjuk termasuk kaedah dengan penerima penunjuk dan bukan penunjuk. Kaedah yang ditetapkan untuk jenis bukan penunjuk sahaja termasuk kaedah dengan penerima bukan penunjuk.

Mari kita lihat contoh:

type stringer interface {
    string() string
}

type mytype struct {
    value string
}

func (m *mytype) string() string { return m.value }
Salin selepas log masuk

stringer jenis antara muka hanya mempunyai satu kaedah: string(). Sebarang nilai yang disimpan dalam nilai antara muka stringer mesti mempunyai kaedah ini. Kami juga mencipta mytype dan mencipta kaedah mytype.string() dengan

pointerstringer 接口类型只有一个方法:string()。存储在接口值 stringer 中的任何值都必须具有此方法。我们还创建了一个 mytype,并创建了一个带有指针接收器的方法 mytype.string()。这意味着 string() 方法位于 *mytype 类型的 方法集 中,但是不在 mytypereceiver. Ini bermakna kaedah string() berada dalam

set kaedah

jenis *mytype, tetapi bukan dalam mytype. mytype 的值分配给 stringer

Apabila kami cuba menukar pembolehubah jenis

kami mendapat ralat berikut: *mytype 类型的值分配给 stringer

m := mytype{value: "something"}

var s stringer
s = m // cannot use m (type mytype) as type stringer in assignment:
      //   mytype does not implement stringer (string method has pointer receiver)
Salin selepas log masuk

Tetapi jika kita cuba menambah

, semuanya berfungsi dengan baik:

Kami mendapat keputusan yang diharapkan (cuba di

pergi taman permainan

):

something
Salin selepas log masuk

Oleh itu keperluan untuk mendapatkan ralat masa penyusunan ini:
  • Satu
  • bukan penunjuk
  • Nilai jenis konkrit yang diberikan (atau diluluskan atau ditukar)
  • Jenis antara muka yang diberikan (atau diluluskan atau ditukar) Jenis konkrit mempunyai kaedah yang diperlukan oleh antara muka, tetapi mempunyai
  • penerima penunjuk

Kemungkinan menyelesaikan masalah:
  • Penunjuk kepada nilai mesti digunakan dan set kaedahnya akan termasuk kaedah dengan penerima penunjuk atau jenis penerima mesti ditukar kepada
  • bukan penunjuk
, jadi set kaedah jenis konkrit bukan penunjuk juga akan mengandungi kaedah (dengan itu memuaskan antara muka). Ini mungkin atau tidak mungkin, seolah-olah kaedah mesti mengubah suai nilai, penerima bukan penunjuk bukan pilihan.

Struktur dan benam Apabila menggunakan structstruct dan embedding

, biasanya bukan "anda" yang melaksanakan antara muka (menyediakan pelaksanaan kaedah), sebaliknya jenis yang dibenamkan dalam

. Seperti contoh ini: mytype2的方法集不包含内嵌mytypestring()方法,只有*mytype2

type mytype2 struct {
    mytype
}

m := mytype{value: "something"}
m2 := mytype2{mytype: m}

var s stringer
s = m2 // compile-time error again
Salin selepas log masuk
Ralat berlaku semasa menyusun semula, kerana set kaedah , jadi kaedah berikut berfungsi (dalam

Pergi ke taman permainan

): *mytype 并仅使用非指针 mytype2

var s stringer
s = &m2
Salin selepas log masuk
Kami juga boleh menjadikannya berfungsi jika kami membenamkan *jenis saya dan hanya menggunakan bukan penunjuk

jenis2 (dalam

Pergi ke Taman Permainanmytype*mytype),如果我们使用指针 *mytype2):

Selain itu, tidak kira apa yang kita benamkan (

, ia sentiasa berfungsi (dalam

Pergi ke Taman Permainan):

type mytype2 struct {
    *mytype
}

m := mytype{value: "something"}
m2 := mytype2{mytype: &m}

var s stringer
s = &m2
Salin selepas log masuk

Bahagian yang berkaitan daripada spesifikasi (dari bahagian 🎜Jenis Struktur🎜): 🎜

给定一个结构体类型 s 和一个名为 t 的类型,提升的方法包含在该结构体的方法集中,如下所示:

  • 如果 s 包含匿名字段 t,则 s*s 的方法集均包含接收者为 t 的提升方法。 *s 的方法集还包括接收者 *t 的提升方法。
  • 如果 s 包含匿名字段 *t,则 s*s 的方法集都包含接收者为 t*t 的提升方法。

换句话说:如果我们嵌入一个非指针类型,非指针嵌入器的方法集只能获取具有非指针接收器的方法(来自嵌入类型)。

如果我们嵌入一个指针类型,非指针嵌入器的方法集将获取具有指针和非指针接收器的方法(来自嵌入类型)。

如果我们使用指向嵌入器的指针值,则无论嵌入类型是否是指针,指向嵌入器的指针的方法集始终都会获取具有指针和非指针接收器的方法(从嵌入类型)。

注意:

有一个非常相似的情况,即当您有一个包含 mytype 值的接口值时,并且您尝试 类型断言 另一个接口值,stringer。在这种情况下,由于上述原因,断言将不成立,但我们会得到一个略有不同的运行时错误:

m := mytype{value: "something"}

var i interface{} = m
fmt.println(i.(stringer))
Salin selepas log masuk

运行时恐慌(在 go playground 上尝试一下):

panic: interface conversion: main.mytype is not main.stringer:
    missing method string
Salin selepas log masuk

尝试转换而不是类型断言,我们得到了我们正在讨论的编译时错误:

m := MyType{value: "something"}

fmt.Println(Stringer(m))
Salin selepas log masuk

Atas ialah kandungan terperinci X tidak melaksanakan Y (...kaedah mempunyai penerima penunjuk). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah kelemahan debian openssl Apakah kelemahan debian openssl Apr 02, 2025 am 07:30 AM

OpenSSL, sebagai perpustakaan sumber terbuka yang digunakan secara meluas dalam komunikasi yang selamat, menyediakan algoritma penyulitan, kunci dan fungsi pengurusan sijil. Walau bagaimanapun, terdapat beberapa kelemahan keselamatan yang diketahui dalam versi sejarahnya, yang sebahagiannya sangat berbahaya. Artikel ini akan memberi tumpuan kepada kelemahan umum dan langkah -langkah tindak balas untuk OpenSSL dalam sistem Debian. Debianopenssl yang dikenal pasti: OpenSSL telah mengalami beberapa kelemahan yang serius, seperti: Kerentanan Pendarahan Jantung (CVE-2014-0160): Kelemahan ini mempengaruhi OpenSSL 1.0.1 hingga 1.0.1f dan 1.0.2 hingga 1.0.2 versi beta. Penyerang boleh menggunakan kelemahan ini untuk maklumat sensitif baca yang tidak dibenarkan di pelayan, termasuk kunci penyulitan, dll.

Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Mar 21, 2025 pm 06:37 PM

Artikel ini menerangkan cara menggunakan alat PPROF untuk menganalisis prestasi GO, termasuk membolehkan profil, mengumpul data, dan mengenal pasti kesesakan biasa seperti CPU dan isu memori.

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Apr 02, 2025 pm 02:06 PM

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Apakah masalah dengan thread giliran di crawler colly go? Apakah masalah dengan thread giliran di crawler colly go? Apr 02, 2025 pm 02:09 PM

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Apr 02, 2025 am 09:12 AM

Laluan Pembelajaran Backend: Perjalanan Eksplorasi dari Front-End ke Back-End sebagai pemula back-end yang berubah dari pembangunan front-end, anda sudah mempunyai asas Nodejs, ...

Bagaimana anda menentukan kebergantungan dalam fail go.mod anda? Bagaimana anda menentukan kebergantungan dalam fail go.mod anda? Mar 27, 2025 pm 07:14 PM

Artikel ini membincangkan menguruskan kebergantungan modul Go melalui Go.Mod, meliputi spesifikasi, kemas kini, dan resolusi konflik. Ia menekankan amalan terbaik seperti versi semantik dan kemas kini biasa.

Kaedah Pemantauan PostgreSQL di bawah Debian Kaedah Pemantauan PostgreSQL di bawah Debian Apr 02, 2025 am 07:27 AM

Artikel ini memperkenalkan pelbagai kaedah dan alat untuk memantau pangkalan data PostgreSQL di bawah sistem Debian, membantu anda memahami pemantauan prestasi pangkalan data sepenuhnya. 1. Gunakan PostgreSQL untuk membina pemantauan PostgreSQL sendiri menyediakan pelbagai pandangan untuk pemantauan aktiviti pangkalan data: PG_STAT_ACTIVITY: Memaparkan aktiviti pangkalan data dalam masa nyata, termasuk sambungan, pertanyaan, urus niaga dan maklumat lain. PG_STAT_REPLITI: Memantau status replikasi, terutamanya sesuai untuk kluster replikasi aliran. PG_STAT_DATABASE: Menyediakan statistik pangkalan data, seperti saiz pangkalan data, masa komitmen/masa rollback transaksi dan petunjuk utama lain. 2. Gunakan alat analisis log pgbadg

See all articles