Golang 隱式記憶體別名 Implicit Memory Aliasing 與其檢測方法
在使用 Golang 時,我們可能會遇到一種稱為隱式記憶體別名(Implicit Memory Aliasing)的問題。這篇文章將探討這個問題以及如何使用工具和語言特性來解決它。 隱式記憶體別名的問題 隱式記憶體別名主要發生在 range 語句中。當使用 range 對一個切片 slice 或映射 map 進行迭代時,Iterator 在每次迭代中並不是唯一的實例。這可能導致意外的行為,特別是在並發環境或當迭代變量被指針引用時。 slice with Implicit Memory Aliasing 下面示例可能是基本的 golang 面試題,會問你迭代後的 pointers 內的 Name 為何 答案是 Joe Joe Joe package main import "fmt" type Person struct { Name string Gender string } func main() { persons := []Person{ {Name: "John", Gender: "M"}, {Name: "Jane", Gender: "F"}, {Name: "Joe", Gender: "X"}, } pointers := make([]*string, len(persons)) for index, person := range persons { fmt.Printf("%p, %p, %p, %v\n", &person, &person.Name, &person.Gender, &persons[index].Name) pointers[index] = &person.Name } for index := range pointers { fmt.Println(pointers[index], *pointers[index]) } } channel with Implicit Memory Aliasing 同樣的情況也會發生在 channel 的迭代。 ...