Go 中的指针运算

考虑到你可以(想不出一个很好的方法来放置它,但是)在 Go 中操作指针,是否有可能像在 C 中那样执行指针算术,比如迭代数组?我知道现在循环适用于那种事情,但我只是好奇是否可能。


拉丁的传说
浏览 242回答 2
2回答

森栏

不。来自Go FAQ:为什么没有指针算法?安全。如果没有指针算术,就有可能创建一种永远无法派生出错误成功的非法地址的语言。编译器和硬件技术已经发展到使用数组索引的循环可以与使用指针算法的循环一样高效。此外,缺乏指针算法可以简化垃圾收集器的实现。话虽如此,您可以通过使用该unsafe包来解决这个问题,但不要这样做:package mainimport "fmt"import "unsafe"func main() {&nbsp; &nbsp; vals := []int{10, 20, 30, 40}&nbsp; &nbsp; start := unsafe.Pointer(&vals[0])&nbsp; &nbsp; size := unsafe.Sizeof(int(0))&nbsp; &nbsp; for i := 0; i < len(vals); i++ {&nbsp; &nbsp; &nbsp; &nbsp; item := *(*int)(unsafe.Pointer(uintptr(start) + size*uintptr(i)))&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(item)&nbsp; &nbsp; }}https://play.golang.org/p/QCHEQqy6Lg

杨魅力

从 Go 1.17 开始,我们现在有了unsafe.Add,这让它变得更容易了:package mainimport (&nbsp; &nbsp; "unsafe")func main() {&nbsp; &nbsp; vals := []int{10, 20, 30, 40}&nbsp; &nbsp; ptrStart := unsafe.Pointer(&vals[0])&nbsp; &nbsp; itemSize := unsafe.Sizeof(vals[0])&nbsp; &nbsp; for i := 0; i < len(vals); i++ {&nbsp; &nbsp; &nbsp; &nbsp; item := *(*int)(unsafe.Add(ptrStart, uintptr(i)*itemSize))&nbsp; &nbsp; &nbsp; &nbsp; println(item)&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go