


Cara paling berkesan untuk mencipta kunci peta unik dalam Go
Dalam bahasa Go, cara paling berkesan untuk mencipta kunci pemetaan unik sentiasa menjadi perhatian pembangun. Apabila berhadapan dengan senario di mana kunci perlu unik, kita perlu mencari kaedah yang cekap dan boleh dipercayai. Editor PHP Baicao akan berkongsi dalam artikel ini salah satu kaedah paling berkesan untuk membantu anda mencipta kunci pemetaan unik dalam bahasa Go, menjadikan kod anda lebih optimum dan cekap. Sama ada anda sedang memproses data berskala besar atau melaksanakan aplikasi yang sangat serentak, kaedah ini boleh membantu anda meningkatkan prestasi dan kecekapan. Mari kita ketahui bersama!
Kandungan soalan
Saya ada satu map[any]SomeType
di suatu tempat di perpustakaan. Saya mahu pengguna perpustakaan dapat mencipta kunci untuk peta ini supaya mereka dijamin tidak bercanggah dalam satu pelaksanaan aplikasi, dan saya mahu kunci ini cekap untuk carian peta.
Perkara pertama yang terlintas di fikiran ialah menggunakan alamat memori beberapa objek kosong yang unik. Tetapi semua yang saya cuba setakat ini gagal:
<code>package main import "fmt" var key1 = &struct{}{} var key2 = &struct{}{} var key3 = struct{}{} var key4 = struct{}{} var key5 = new(struct{}) var key6 = new(struct{}) func main() { fmt.Println("key1 == key2", key1 == key2) fmt.Println("key3 == key4", &key3 == &key4) fmt.Println("key5 == key6", key5 == key6) test(key1, key2, "func12") test(&key3, &key4, "func34") test(key5, key6, "func56") } func test(a, b any, msg string) { fmt.Println(msg, a == b) } </code>
Cetak
key1 == key2 true key3 == key4 false key5 == key6 true func12 true func34 true func56 true
Jadi mendapatkan alamat pembolehubah struct kosong hampir boleh dilakukan sehingga anda menghantarnya ke fungsi. Kemudian perbezaan itu hilang.
Saya tidak mahu memperkenalkan pendaftaran kunci kerana ia adalah komplikasi yang tidak perlu. Saya juga tidak mahu menggunakan rentetan, kerana pengguna perpustakaan yang berbeza perlu merundingkan kunci atau menggunakan ruang nama, dan keperluan untuk mencincang dan membandingkan rentetan juga merupakan komplikasi yang tidak perlu.
Ada kaedah yang saya tidak terfikir?
Penyelesaian
Pustaka standard menggunakan bahagian context.Context
时使用了一个“技巧”:上下文能够在其中携带任意值,并且这些值使用 interface{}
进行键控(从一段时间以来 any
)1。然后,您自己的包可以为其将要使用的上下文键定义一个新的未导出类型,然后定义一组具有该类型的常量作为该包已知的上下文键。现在的技巧是,类型始终是 interface{}
sebarang nilai jenis, jadi tidak mungkin untuk mencipta nilai antara muka yang bercanggah dengan kekunci pakej.
Pada asasnya ia seperti ini:
package mypkg type contextKey int const ( KeyFoo = contextKey(iota) KeyBar )
Sekarang, apabila anda melaksanakan key interface{} = KeyFoo
时,几乎可以保证程序中任何其他代码段都不能具有与 key
相同的值,因为其中一部分将(指向的内部指针)未导出输入 contextKey
.
Anda mungkin mahu membaca artikel klasik ini untuk memahami cara ia berfungsi (sedikit berkarat, tetapi masih 99% betul)).
Bagi saya, ini kelihatan seperti cara ke hadapan: pengguna pakej anda boleh menjana kunci mereka sendiri dan menyerahkannya ke peta anda, yang sepatutnya mempunyai jenis kunci interface{}
或 any
. Tidak ada keperluan untuk pendaftaran berpusat untuk menyerahkan kunci ini.
1 Lihat context.Context.Value() dan context.WithValue() untuk mendapatkan maklumat lanjut. Yang terakhir memberikan lebih banyak petua tentang cara menjana kunci.
Atas ialah kandungan terperinci Cara paling berkesan untuk mencipta kunci peta unik dalam Go. 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

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

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





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. � ...

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

Multithreading dalam bahasa dapat meningkatkan kecekapan program. Terdapat empat cara utama untuk melaksanakan multithreading dalam bahasa C: Buat proses bebas: Buat pelbagai proses berjalan secara bebas, setiap proses mempunyai ruang ingatan sendiri. Pseudo-Multithreading: Buat pelbagai aliran pelaksanaan dalam proses yang berkongsi ruang memori yang sama dan laksanakan secara bergantian. Perpustakaan multi-threaded: Gunakan perpustakaan berbilang threaded seperti PTHREADS untuk membuat dan mengurus benang, menyediakan fungsi operasi benang yang kaya. Coroutine: Pelaksanaan pelbagai threaded ringan yang membahagikan tugas menjadi subtask kecil dan melaksanakannya pada gilirannya.

Tiada fungsi yang dinamakan "SUM" dalam Perpustakaan Standard Bahasa C. "Jumlah" biasanya ditakrifkan oleh pengaturcara atau disediakan dalam perpustakaan tertentu, dan fungsinya bergantung kepada pelaksanaan tertentu. Senario biasa dijumlahkan untuk tatasusunan, dan juga boleh digunakan dalam struktur data lain, seperti senarai yang dipautkan. Di samping itu, "jumlah" juga digunakan dalam bidang seperti pemprosesan imej dan analisis statistik. Fungsi "jumlah" yang sangat baik harus mempunyai kebolehbacaan, ketahanan dan kecekapan yang baik.

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...
