Adakah terdapat Setara dengan memset dalam Go?
Dalam C , fungsi memset membenarkan pemulaan tatasusunan yang cekap dengan nilai tertentu. Dalam Go, walaupun tiada persamaan langsung, beberapa teknik boleh mencapai hasil yang serupa.
Lelaran Gelung
Pendekatan paling mudah ialah menggunakan gelung untuk menetapkan setiap elemen tatasusunan kepada nilai yang dikehendaki.
func memsetLoop(a []int, v int) { for i := range a { a[i] = v } }
Diulang copy()
Mengambil kesempatan daripada fungsi copy() yang sangat dioptimumkan, kami boleh memanfaatkan corak salinan berulang untuk menetapkan nilai tatasusunan dengan cekap.
func memsetRepeat(a []int, v int) { if len(a) == 0 { return } a[0] = v for bp := 1; bp < len(a); bp *= 2 { copy(a[bp:], a[:bp]) } }
Hasil Penanda Aras
Untuk menilai prestasi teknik ini, kami menanda arasnya antara satu sama lain untuk tatasusunan yang berbeza saiz.
var a = make([]int, 1000) // Size will vary func BenchmarkLoop(b *testing.B) { for i := 0; i < b.N; i++ { memsetLoop(a, 10) } } func BenchmarkRepeat(b *testing.B) { for i := 0; i < b.N; i++ { memsetRepeat(a, 11) } }
Hasilnya menunjukkan bahawa memsetRepeat() mengatasi prestasi memsetLoop() untuk tatasusunan yang lebih besar, menunjukkan kecekapannya untuk pemulaan pantas.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memulakan Tatasusunan dalam Go dengan Cekap, Sama seperti memset C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!