mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-12-29 08:16:21 +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
|
||
|
*/
|