1 回答

TA貢獻1772條經驗 獲得超5個贊
毫不奇怪,Go 數組在內存中是連續布局的。然后由于 Go 類型是靜態大小的,第 n 個項目的地址等于第 0 個元素的地址加上等于項目類型大小的字節偏移量。
這可以大致形式化為(偽代碼):
addr_n = addr_0 + (n * size_of(item))
在 Go 代碼中,使用unsafe.Add
(自 Go 1.17 起):
func main() {
const a = 1111111111111111111
x := [7]int{a, 1, 33333, 4, 6, 7, 7}
unsafePointer := unsafe.Pointer(&x[0])
for i := range x {
step := unsafe.Sizeof(int(0))
addr_n := unsafe.Add(unsafePointer, int(step)*i)
fmt.Printf("addr: %p, val: %d\n", addr_n, *(*int)(addr_n))
}
}
哪個打?。?/p>
addr: 0xc000102000, val: 1111111111111111111
addr: 0xc000102008, val: 1
addr: 0xc000102010, val: 33333
addr: 0xc000102018, val: 4
addr: 0xc000102020, val: 6
addr: 0xc000102028, val: 7
addr: 0xc000102030, val: 7
如果還不是很清楚,十六進制數就是內存地址。這就是fmt
包通常格式化指針的方式。
但是請注意,int
特別是的大小取決于平臺,因此在上面的代碼片段中您不能只添加8
. 要使其具有確定性,您可以使用unsafe.Sizeof(int(0))
.
游樂場:https ://go.dev/play/p/4hu8efVed96
- 1 回答
- 0 關注
- 134 瀏覽
添加回答
舉報