1 回答
TA贡献1876条经验 获得超7个赞
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上试试这些。
- 1 回答
- 0 关注
- 86 浏览
添加回答
举报