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!
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?
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!