我查看了Golang文档,但没有看到如何实现我想要做的事情的示例.具体来说,我正在尝试从inode编写一个映射,由我的机器上类型为uint64的syscall.Stat_t.Ino表示为ino_entry,定义为
type ino_entry struct {
st *syscall.Stat_t
nodes []string
}
其中nodes表示硬链接到inode的所有文件的名称.
但是,如果可以的话,我想避免将文字类型uint64放在地图的规范中.也就是说,不是编写map [uint64] ino_entry,而是更喜欢编写map [typeof(syscall.Stat_t.Ino)] ino_entry,其中typeof(x)返回x的静态(即编译时)类型.我已经尝试了map [syscall.Stat_t.Ino] ino_entry,并且与类型开关类似,映射[syscall.Stat_t.Ino.(type)] ino_entry,但这两个都是语法错误.不用说,map [reflect.Typeof(syscall.Stat_t.Ino)] ino_entry不起作用.据我所知,在没有硬编码结构元素类型的情况下实现这个的唯一方法是使用inomap:= make(map [interface {}] ino_entry)然后使用类型断言访问元素(我不知道正确的语法虽然).
有没有办法根据另一个变量或结构或接口成员的静态类型声明变量的类型,而不明确地对该类型进行硬编码?
最佳答案 看起来您正在尝试使用Reflection来确保机器的可移植性.如果是这种情况,您可以使用更好的工具.
go build可以处理基于arch和os的构建的条件文件包含.
因此,为您支持的每个arch和os组合创建一些文件.在每个文件的顶部添加一些构建约束.
//构建linux,例如386将导致go命令仅在具有386 arch的linux机器上使用此文件.
然后在该文件中为适合该arch的类型添加类型别名:输入Ino uint64
最后将地图创建为地图[Ino] ino_entry.
瓦剌!使用类型别名和条件文件包含的机器可移植性.
您可以在此处阅读有关go的构建约束的更多信息:http://golang.org/pkg/go/build/