mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-12-27 15:26:20 +00:00
39 lines
649 B
Go
39 lines
649 B
Go
// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
|
|
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
|
|
// See page 357.
|
|
|
|
// Package unsafeptr demonstrates basic use of unsafe.Pointer.
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"unsafe"
|
|
)
|
|
|
|
func main() {
|
|
//!+main
|
|
var x struct {
|
|
a bool
|
|
b int16
|
|
c []int
|
|
}
|
|
|
|
// equivalent to pb := &x.b
|
|
pb := (*int16)(unsafe.Pointer(
|
|
uintptr(unsafe.Pointer(&x)) + unsafe.Offsetof(x.b)))
|
|
*pb = 42
|
|
|
|
fmt.Println(x.b) // "42"
|
|
//!-main
|
|
}
|
|
|
|
/*
|
|
//!+wrong
|
|
// NOTE: subtly incorrect!
|
|
tmp := uintptr(unsafe.Pointer(&x)) + unsafe.Offsetof(x.b)
|
|
pb := (*int16)(unsafe.Pointer(tmp))
|
|
*pb = 42
|
|
//!-wrong
|
|
*/
|