Search code examples
pointersgopointer-arithmetic

Pointer arithmetic in Go


Considering you can (can't think of a great way to put it, but) manipulate pointers in Go, is it possible to perform pointer arithmetic like you would in C, say for iterating over an array? I know loops are just fine for that kind of things these days but I'm just curious if it's possible.


Solution

  • No. From the Go FAQ:

    Why is there no pointer arithmetic?

    Safety. Without pointer arithmetic it's possible to create a language that can never derive an illegal address that succeeds incorrectly. Compiler and hardware technology have advanced to the point where a loop using array indices can be as efficient as a loop using pointer arithmetic. Also, the lack of pointer arithmetic can simplify the implementation of the garbage collector.

    That being said, you can get around this by using the unsafe package, but just don't:

    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