Senarai struktur/antara muka biasa di Golang
editor php Baicao akan memperkenalkan anda kepada senarai struktur/antara muka biasa di Golang dalam artikel ini. Golang ialah bahasa pengaturcaraan sumber terbuka yang mudah dipelajari, cekap dan boleh dipercayai Ia digunakan secara meluas dalam pengaturcaraan rangkaian, pengkomputeran awan dan bidang lain. Di Golang, struktur dan antara muka biasa ialah konsep yang sangat penting yang boleh membantu kami mencapai kebolehgunaan semula dan kebolehskalaan kod. Melalui pengenalan artikel ini, saya percaya pembaca boleh lebih memahami dan menggunakan struktur dan antara muka biasa di Golang dan meningkatkan kemahiran pengaturcaraan mereka.
Kandungan soalan
Adakah terdapat cara untuk mendapatkan senarai struktur/antara muka biasa?
Ini yang saya mahu capai.
<code>package main type List[T any] struct { Elements []T } func (f *List[T]) Add(el T) { f.Elements = append(f.Elements, el) } type ListInterface[T any] interface { Add(el T) } func main() { listOfLists := make([]ListInterface[any], 0) listOfLists = append(listOfLists, &List[int]{}) } </code>
Ini adalah kesilapan yang saya dapat.
cannot use &List[int]{} (value of type *List[int]) as ListInterface[any] value in argument to append: *List[int] does not implement ListInterface[any] (wrong type for method Add) have Add(int) want Add(any)
Jadi, jika saya faham betul, in go any
adalah jenisnya sendiri. Ia bukan sinonim untuk "apa sahaja jenis yang dikehendaki oleh masa jalan". Soalan saya, adakah mungkin untuk melakukan sesuatu seperti ini?
Penyelesaian
Apa yang anda cuba lakukan di sini menunjukkan bahawa anda mengharapkan generik go mampu memadam jenis (sama seperti generik Java). Tetapi itu tidak berlaku.
Anda ada List[int]
,这意味着它的 Add
kaedah seperti ini:
func (l *List) Add(el int) { l.Elements = append(l.Elements, el) }
Kemudian cuba tambahkannya pada kepingan objek yang melaksanakan antara muka itu:
Add(v any)
Sekarang, anda mungkin berfikir bahawa int
boleh digunakan sebagai int
可以用作 any
, anda betul, boleh, tetapi apabila anda melihat:
var s []ListInterface[any]
Anda mengatakan bahawa semua elemen dalam kepingan tersebut akan mempunyai kaedah Add
方法,该方法采用 any
jadi ini bermakna:
s[0].Add("foo") s[1].Add(123)
Panggilan hendaklah sentiasa sah. Jika s[0]
的类型为 List[int]
(如您的代码片段中的情况),则这不成立。您将尝试将字符串附加到 Elements
,其类型为 []int
.
Ada pepatah mengatakan pembalikan harus dibenarkan:
s := []ListInterface[int]{} s = append(s, &List[any]{})
Nampaknya List[any]
将接受 int
parameter, tetapi ini juga tidak dibenarkan. Ini boleh berguna dalam beberapa kes, tetapi dalam banyak kes ini boleh menjadi masalah.
Pada asasnya, generik dalam Go ialah sesuatu yang dikendalikan pada masa penyusunan. Apabila anda mencipta List[int]
时,编译器将创建一个类似 List_int
的类型,并在该类型上实现 Add(el int)
方法,与您最终使用的任何其他 List
类型相同。这些类型都不会具有 Add(any)
方法,除非您创建 List[any]
. Fikirkannya sebagai penjanaan kod plat dandang dibantu pengkompil. Bukan pemadaman jenis masa jalan.
Keputusan: List[int]
和 List[any]
adalah jenis yang berbeza dan oleh itu tidak boleh duduk bersebelahan dalam kepingan seolah-olah mereka adalah jenis yang sama. Jika anda mahu dapat melakukan apa yang anda mahu, anda boleh lakukan ini:
func (l *List[T]) AddAny(v any) { tv, ok := v.(T) if !ok { return // or return an error } l.Add(tv) }
Ambil pendekatan nilai any
, menggunakan penegasan jenis untuk melihat sama ada nilai yang diberikan serasi dengan jenis asas senarai, dan tambahkannya jika itu yang berlaku. Anda kemudian boleh menambahnya ke dalam satu kepingan seperti ini:
type Lists interface { AddAny(any) } s := []Lists{} s = append(s, &List[int]{}, &List[string]{}) s[0].AddAny(123) // will work s[0].AddAny("foo") // will not, with the current code this will silently fail s[1].AddAny("foo") // works fine s[1].AddAny(123) // silently fails
Tetapi pada hakikatnya, apabila anda melakukan sesuatu seperti ini, kod itu hanya menjerit masalah X-Y, anda cuba menggunakan Y (generik) untuk menyelesaikan masalah anda, sedangkan masalah sebenar ialah X: apakah cara terbaik untuk menyelesaikan masalah?
Atas ialah kandungan terperinci Senarai struktur/antara muka biasa di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

C++ menyediakan set perpustakaan sumber terbuka yang kaya yang meliputi fungsi berikut: struktur dan algoritma data (Perpustakaan Templat Standard) berbilang benang, ungkapan biasa (Boost) antara muka pengguna grafik (Eigen) antara muka pengguna grafik (Qt) penglihatan komputer (OpenCV) pembelajaran mesin. (TensorFlow) Penyulitan (OpenSSL) Pemampatan data (zlib) Pengaturcaraan rangkaian (libcurl) Pengurusan pangkalan data (sqlite3)

Pustaka standard C++ menyediakan fungsi untuk mengendalikan pertanyaan DNS dalam pengaturcaraan rangkaian: gethostbyname(): Cari maklumat hos berdasarkan nama hos. gethostbyaddr(): Cari maklumat hos berdasarkan alamat IP. dns_lookup(): Asynchronously menyelesaikan DNS.

Terdapat 12 tahap peperiksaan Python, daripada pemula hingga lanjutan, untuk menguasai sintaks asas Python, ciri lanjutan, konsep lanjutan dan mekanisme asas, dsb., dengan kesukaran yang semakin meningkat secara beransur-ansur.

Protokol yang biasa digunakan dalam pengaturcaraan rangkaian Java termasuk: TCP/IP: digunakan untuk penghantaran data dan pengurusan sambungan yang boleh dipercayai. HTTP: digunakan untuk penghantaran data web. HTTPS: Versi HTTP selamat yang menggunakan penyulitan untuk menghantar data. UDP: Untuk pemindahan data yang cepat tetapi tidak stabil. JDBC: digunakan untuk berinteraksi dengan pangkalan data hubungan.

Fungsi C++ boleh mencapai keselamatan rangkaian dalam pengaturcaraan rangkaian Kaedah termasuk: 1. Menggunakan algoritma penyulitan (openssl) untuk menyulitkan komunikasi 2. Menggunakan tandatangan digital (cryptopp) untuk mengesahkan integriti data dan identiti pengirim ( htmlcxx) untuk menapis dan membersihkan input pengguna.

Panduan kemasukan ke amalan Java: termasuk pengenalan sintaks asas (pembolehubah, operator, aliran kawalan, objek, kelas, kaedah, warisan, polimorfisme, enkapsulasi), perpustakaan kelas teras Java (pengendalian pengecualian, koleksi, generik, aliran input/output , pengaturcaraan rangkaian, tarikh dan masa API), kes praktikal (aplikasi kalkulator, termasuk contoh kod).

Masa yang diperlukan untuk menguasai Golang berbeza dari seorang ke seorang, tetapi ia biasanya mengambil masa beberapa bulan hingga beberapa tahun. Peringkat pembelajaran termasuk: Asas (1-2 bulan), Pertengahan (3-6 bulan), Lanjutan (6-12 bulan atau lebih lama). Faktor yang mempercepatkan pembelajaran termasuk amalan berterusan, kerja projek, penglibatan komuniti dan sumber dalam talian. Faktor yang mempengaruhi termasuk pengalaman pengaturcaraan terdahulu, kekerapan belajar, dan bahan kajian.

Fungsi utama untuk menghuraikan alamat dalam bahasa Go termasuk: net.ParseIP(): Menghuraikan alamat IPv4 atau IPv6. net.ParseCIDR(): Parse teg CIDR. net.ResolveIPAddr(): Selesaikan nama hos atau alamat IP ke dalam alamat IP. net.ResolveTCPAddr(): Selesaikan nama hos dan port ke alamat TCP. net.ResolveUDPAddr(): Selesaikan nama hos dan port ke alamat UDP.
