web-dev-qa-db-ja.com

Goでのポインター演算

Goでポインターを操作することはできますが(素晴らしい方法は考えられませんが)、Cでのようにポインターの計算を実行することは可能ですか(たとえば、配列の反復処理)。ループは最近、そのようなことには問題ないことを知っていますが、それが可能かどうか知りたいだけです。

23
user5360268

いいえ。 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

36
Tim Cooper