Есть ли адресная арифметика в Go

«Есть ли адресная арифметика в Go» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go нет прямой адресной арифметики как в C/C++. Указатели в Go безопасны — нельзя инкрементировать/декрементировать указатель или выполнять арифметические операции над ними.

Однако, можно использовать unsafe.Pointer для низкоуровневых операций, но это не рекомендуется без крайней необходимости:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    arr := [3]int{1, 2, 3}
    p := &arr[0]
    // Преобразуем в unsafe.Pointer, затем в uintptr
    addr := uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(arr[0])
    // Получаем указатель на следующий элемент
    next := (*int)(unsafe.Pointer(addr))
    fmt.Println(*next) // 2
}

Работа с unsafe требует особой осторожности — неправильное использование может привести к неопределённому поведению. В 99% случаев лучше использовать срезы или другие безопасные механизмы Go.