Подтвердить что ты не робот

Арифметика указателя в go

Учитывая, что вы можете (не можете придумать отличный способ выразить это, но) манипулировать указателями в golang, возможно ли выполнить арифметику указателя в golang, как в C, скажем, для итерации по массиву? Я знаю, что в наши дни петли отлично подходят для таких вещей, мне просто интересно, если это возможно.

4b9b3361

Ответ 1

Нет. Из Часто задаваемые вопросы о переходе:

Почему нет арифметики указателей?

Безопасность. Без арифметики указателя можно создать язык, который никогда не сможет получить незаконный адрес, который будет выполнен неправильно. Компилятор и аппаратная технология продвинулись до такой степени, что цикл с использованием индексов массива может быть таким же эффективным, как цикл, используя арифметику указателя. Кроме того, отсутствие арифметики указателя может упростить реализацию сборщика мусора.

Как говорится, вы можете обойти это, используя 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