为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的指针运算

Go 中的指针运算

Go
拉丁的传说 2021-11-08 16:55:38
考虑到你可以(想不出一个很好的方法来放置它,但是)在 Go 中操作指针,是否有可能像在 C 中那样执行指针算术,比如迭代数组?我知道现在循环适用于那种事情,但我只是好奇是否可能。
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

不。来自Go FAQ:


为什么没有指针算法?

安全。如果没有指针算术,就有可能创建一种永远无法派生出错误成功的非法地址的语言。编译器和硬件技术已经发展到使用数组索引的循环可以与使用指针算法的循环一样高效。此外,缺乏指针算法可以简化垃圾收集器的实现。


话虽如此,您可以通过使用该unsafe包来解决这个问题,但不要这样做:


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


查看完整回答
反对 回复 2021-11-08
?
杨魅力

TA贡献1811条经验 获得超6个赞

从 Go 1.17 开始,我们现在有了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)

    }

}


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信