Turutan Tugasan dalam Peta
Dalam Go, peta ialah koleksi tidak tertib pasangan nilai kunci. Walau bagaimanapun, output coretan kod berikut nampaknya mencadangkan susunan kepada pasangan nilai kunci:
package main import "fmt" type Vertex struct { Lat, Long float64 } var m map[string]Vertex func main() { m = make(map[string]Vertex) m["Bell Labs"] = Vertex{ 40.68433, 74.39967, } m["test"] = Vertex{ 12.0, 100, } fmt.Println(m["Bell Labs"]) fmt.Println(m) }
Apabila coretan kod di atas dilaksanakan, ia mengeluarkan:
{40.68433 74.39967} map[Bell Labs:{40.68433 74.39967} test:{12 100}]
Walau bagaimanapun, jika ruang putih di sekeliling pendakap kerinting kanan dalam tugasan kekunci "ujian" diubah suai, output perubahan:
m["test"] = Vertex{ 12.0, 100, }
Dengan pengubahsuaian ini, output menjadi:
{40.68433 74.39967} map[test:{12 100} Bell Labs:{40.68433 74.39967}]
Penjelasan
Tingkah laku yang diperhatikan adalah disebabkan oleh rawak Fungsi cincang peta Go. Rawak ini dilaksanakan untuk mengelakkan serangan penafian perkhidmatan yang mengeksploitasi perlanggaran cincang. Seperti yang dinyatakan dalam penjejak isu Go:
http://code.google.com/p/go/issues/detail?id=2630
Pesanan peta tidak dijamin dalam Go. Walaupun pelaksanaan semasa tidak menyusun semula peta secara eksplisit, pelaksanaan masa hadapan mungkin padat peta semasa GC atau operasi lain, yang berpotensi menjejaskan pesanan. Oleh itu, adalah tidak bijak untuk bergantung pada susunan peta dalam kod anda.
Atas ialah kandungan terperinci Mengapa Keluaran Peta Go Nampak Tersusun Walaupun Peta Tidak Tersusun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!