我试图从接口中获取任何结构的大小。这对于按值传递的对象效果很好,但我不知道如何在使用接口传递引用时获取对象的大小。
这是一个表明我遇到的问题的示例: https://play.golang.org/p/QXXZm-j7_hZ
package main
import (
"fmt"
"reflect"
"unsafe"
)
type T struct {
c [50]byte
}
func main() {
fmt.Println("Hello, playground")
var t T
s := unsafe.Sizeof(t)
fmt.Println("expected size", s)
getSize(t, &t)
}
func getSize(valueObject interface{}, referenceObject interface{}) {
vs := []uintptr{
unsafe.Sizeof(valueObject),
unsafe.Sizeof(reflect.ValueOf(valueObject)),
reflect.TypeOf(valueObject).Size(), // THIS WORKS FOR VALUE
reflect.TypeOf(reflect.ValueOf(valueObject)).Size(),
0, //reflect.TypeOf(reflect.ValueOf(valueObject).Elem()).Size(), //EXCEPTION ACCESSING ELEM WITH VALUE
0, //reflect.TypeOf(reflect.ValueOf(valueObject).Elem()).Size(), //EXCEPTION ACCESSING ELEM WITH VALUE
0, //unsafe.Sizeof(reflect.ValueOf(valueObject).Elem()), //EXCEPTION ACCESSING ELEM WITH VALUE
0, //unsafe.Sizeof(reflect.TypeOf(reflect.ValueOf(valueObject).Elem())), //EXCEPTION ACCESSING ELEM WITH …Run Code Online (Sandbox Code Playgroud) 我在读回已序列化为十六进制格式的值时遇到问题。当我格式化一个整数时,下面的代码产生一个 0x14 的值。但是,当我尝试从字符串中读取该值时,得到的结果无效。有人可以帮我弄清楚我做错了什么吗?
我有预先存在的文本文件,我正在用包含这种格式的多行进行解析,因此序列化为不同的格式将不是一个可行的解决方案。我需要使用这种特定格式。
根据 go 文档,这应该有效:https : //golang.org/pkg/fmt/
动词的行为类似于 Printf 的动词。例如,%x 将扫描一个整数作为十六进制数,而 %v 将扫描该值的默认表示格式。Printf 动词 %p 和 %T 以及标志 # 和 + 未实现。对于浮点和复数值,所有有效的格式化动词(%b %e %E %f %F %g %G %x %X 和 %v)都是等价的,并且接受十进制和十六进制表示法(例如:“2.3 e+7", "0x4.5p-8") 和数字分隔下划线(例如:“3.14159_26535_89793”)。
package main
import (
"fmt"
)
func main() {
encode := 20
fmt.Println(fmt.Sprintf("%#x", encode)) // 0x14
var decode int
numRead, err := fmt.Sscanf("0x14", "%#x", &decode)
fmt.Println(decode, numRead, err) // 0 1 bad verb '%#' for integer
numRead, err = fmt.Sscanf("0x14", "%x", &decode) …Run Code Online (Sandbox Code Playgroud)