Map 获取结构元素的静态类型

Map 获取结构元素的静态类型,map,go,declaration,compile-time,type-declaration,Map,Go,Declaration,Compile Time,Type Declaration,我已经查阅了Golang文档,但还没有看到如何实现我期望的目标的示例。具体地说,我正在尝试编写一个从inodes(由syscall.Stat\u.Ino表示)到inou条目的映射,Ino条目定义为 type ino_entry struct { st *syscall.Stat_t nodes []string } 其中节点表示硬链接到inode的所有文件的名称 但是,如果可以的话,我希望避免将文本类型uint64放入映射的规范中。也就是说,我宁愿写map[uint64]

我已经查阅了Golang文档,但还没有看到如何实现我期望的目标的示例。具体地说,我正在尝试编写一个从inodes(由
syscall.Stat\u.Ino
表示)到inou条目的映射,Ino条目定义为

type ino_entry struct {
    st    *syscall.Stat_t
    nodes []string
}
其中节点表示硬链接到inode的所有文件的名称

但是,如果可以的话,我希望避免将文本类型
uint64
放入映射的规范中。也就是说,我宁愿写
map[uint64]ino\u条目
,而不是写
map[typeof(syscall.Stat\u t.ino)]ino\u条目
,其中
typeof(x)
返回
x的静态(即编译时)类型。我尝试了
map[syscall.Stat\u t.Ino]Ino\u条目
,并且通过与类型开关的类比,
map[syscall.Stat\u t.Ino.(type)]Ino\u条目
,但这两个都是语法错误。不用说,
map[reflect.Typeof(syscall.Stat\u t.Ino)]Ino\u条目
不起作用。据我所知,在不硬编码结构元素类型的情况下实现这一点的唯一方法是使用
inomap:=make(map[interface{}]inou entry)
,然后使用类型断言访问元素(尽管我不知道正确的语法)


有没有一种方法可以基于另一个变量或结构或接口成员的静态类型声明变量的类型,而无需显式硬编码该类型?

Cf。OP中的最后一个问题:有,有一种方法可以基于任何表达式的类型声明变量的类型,而无需硬复制表达式的类型:

v := expr // equal to var v typeof(expr); v = expr;
expr
还包括您提到的大多数实体,即另一个变量,一个结构类型的“thing”,但不包括接口成员(因为规范中没有提及任何内容的成员)


不幸的是,这与声明映射类型无关,其中/时使用的类型文本的形式为
map[T]U
。这里的
T
U
都不能像上面讨论的短变量声明那样被推断出来。

Stat\U T
对任何机器都是有效的,并且它的
Ino
字段总是
uint64
,所以这在这里不应该是问题

如果有一个编译时操作符可以静态地获取该类型,那么它必须隐藏得很好


但是,您可以定义一个类型别名:
type ino\u id uint64
,这对我来说更具可读性。

看起来您正试图使用反射来确保机器的可移植性。如果是这样的话,你可以使用一个更好的工具

go build
可以处理基于arch和os的构建的条件文件包含

因此,为您支持的每个arch和os组合创建一些文件。在每个文件的顶部添加一些构建约束

例如,
/+buildlinux,386
将导致go命令仅在具有386 arch的linux机器上使用此文件

然后在该文件中为适合该拱门的类型添加类型别名:
type Ino uint64

最后将地图创建为
地图[Ino]Ino\u条目

哇!使用go的类型别名和条件文件包含的机器可移植性


您可以在此处阅读有关go构建约束的更多信息:

我要求的似乎不可能,因此我提交了一份to go。已接受,因为您告诉我解决机器可移植性问题的最佳方法(尽管在这种情况下,看起来不一定会有问题)。