Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pointer arithmetic in Go

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


As of Go 1.17, we now have unsafe.Add, which makes it a little easier:

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)
    }
}

Playground.