Jadual Kandungan
Kandungan soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Cara paling berkesan untuk mencipta kunci peta unik dalam Go

Cara paling berkesan untuk mencipta kunci peta unik dalam Go

Feb 11, 2024 pm 05:06 PM
pergi bahasa perpustakaan standard

在 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>
Salin selepas log masuk

Cetak

key1 == key2 true
key3 == key4 false
key5 == key6 true
func12 true
func34 true
func56 true
Salin selepas log masuk

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
)
Salin selepas log masuk

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!

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

Video Face Swap

Video Face Swap

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

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

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

Empat cara untuk melaksanakan multithreading dalam bahasa c Empat cara untuk melaksanakan multithreading dalam bahasa c Apr 03, 2025 pm 03:00 PM

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.

Apakah jumlah yang digunakan secara umum dalam bahasa C? Apakah jumlah yang digunakan secara umum dalam bahasa C? Apr 03, 2025 pm 02:39 PM

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.

Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Apr 02, 2025 pm 02:03 PM

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

Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Apr 02, 2025 pm 04:54 PM

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

Apakah perbezaan antara struktur definisi kata kunci `var` dan` type` dalam bahasa Go? Apakah perbezaan antara struktur definisi kata kunci `var` dan` type` dalam bahasa Go? Apr 02, 2025 pm 12:57 PM

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? Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apr 02, 2025 pm 05:09 PM

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

See all articles