https://go.dev/play/p/X_BH4qGgXHJ
package main
import (
"fmt"
"unsafe"
)
func main() {
var i *int
fmt.Println(unsafe.Sizeof(*i)) // dereference of null pointer i
}
為什么這段代碼沒有
unsafe.Sizeof(*i)
導致運行時恐慌?
uj5u.com熱心網友回復:
規格:包裝不安全:
Alignof對、Offsetof和的呼叫Sizeof是型別的編譯時常量運算式uintptr。
這些函式在編譯時進行評估,在運行時不會發生實際的取消參考。
這是可能的,因為不需要指向的值,只需要有關其型別的資訊,不需要取消參考。
它也記錄在unsafe.Sizeof():
Sizeof 的回傳值是一個 Go 常量。
Go 中的常量是編譯時常量。
另請參閱規范:常量:
常量值由rune、integer、floating-point、imaginary或string字面量、表示常量的識別符號、常量運算式、結果為常量的轉換或某些內置的結果值表示函式,例如
unsafe.Sizeof應用于任何值,cap或len應用于某些運算式,應用于復數常量real和imag復數應用于數值常量。
查看類似的示例(如果不傳遞它們unsafe.Sizeof()會在運行時出現恐慌或無限期阻塞,但它們作業得很好):
fmt.Println(unsafe.Sizeof(*(*int8)(nil))) // 1, no dereferencing
fmt.Println(unsafe.Sizeof([]int16{}[10])) // 2, no indexing
x := "hi"
fmt.Println(unsafe.Sizeof(x[10])) // 1, no indexing
fmt.Println(unsafe.Sizeof(map[interface{}]int{}[[]int{}])) // 8, no indexing
fmt.Println(unsafe.Sizeof((interface{})(nil).(int16))) // 2, no type assertion
i := 0
fmt.Println(unsafe.Sizeof(i / i)) // 8, no division by 0
i = -1
fmt.Println(unsafe.Sizeof(1 << i)) // 8, no negative shift count
fmt.Println(unsafe.Sizeof(make([]int, i))) // 24, no negative length
fmt.Println(unsafe.Sizeof((*[1]int)([]int{}))) // 8, no converting to bigger array
fmt.Println(unsafe.Sizeof((func() int32)(nil)())) // 4, no function call
fmt.Println(unsafe.Sizeof(<-(chan int64)(nil))) // 8, no receiving
var a, b interface{} = []int{}, []int{}
fmt.Println(unsafe.Sizeof(a == b)) // 1, no comparison
在Go Playground上試試這些。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430741.html
下一篇:C通過參考傳遞的誤解
