2 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
不。來(lái)自Go FAQ:
為什么沒(méi)有指針?biāo)惴ǎ?/p>
安全。如果沒(méi)有指針?biāo)阈g(shù),就有可能創(chuàng)建一種永遠(yuǎn)無(wú)法派生出錯(cuò)誤成功的非法地址的語(yǔ)言。編譯器和硬件技術(shù)已經(jīng)發(fā)展到使用數(shù)組索引的循環(huán)可以與使用指針?biāo)惴ǖ难h(huán)一樣高效。此外,缺乏指針?biāo)惴梢院?jiǎn)化垃圾收集器的實(shí)現(xiàn)。
話雖如此,您可以通過(guò)使用該unsafe包來(lái)解決這個(gè)問(wèn)題,但不要這樣做:
package main
import "fmt"
import "unsafe"
func main() {
vals := []int{10, 20, 30, 40}
start := unsafe.Pointer(&vals[0])
size := unsafe.Sizeof(int(0))
for i := 0; i < len(vals); i++ {
item := *(*int)(unsafe.Pointer(uintptr(start) + size*uintptr(i)))
fmt.Println(item)
}
}
https://play.golang.org/p/QCHEQqy6Lg

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
從 Go 1.17 開(kāi)始,我們現(xiàn)在有了unsafe.Add,這讓它變得更容易了:
package main
import (
"unsafe"
)
func main() {
vals := []int{10, 20, 30, 40}
ptrStart := unsafe.Pointer(&vals[0])
itemSize := unsafe.Sizeof(vals[0])
for i := 0; i < len(vals); i++ {
item := *(*int)(unsafe.Add(ptrStart, uintptr(i)*itemSize))
println(item)
}
}
- 2 回答
- 0 關(guān)注
- 271 瀏覽
添加回答
舉報(bào)