4

我查看了 Golang 文档,但没有看到如何实现我想要做的事情的示例。具体来说,我正在尝试编写一个从 inode(由 表示syscall.Stat_t.Ino,在我的机器上具有类型uint64)到 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,并且类似于类型开关,map [syscall.Stat_t.Ino.(type)] ino_entry但是这两个都是语法错误。不用说,map [reflect.Typeof(syscall.Stat_t.Ino)] ino_entry不起作用。据我所知,在不对结构元素的类型进行硬编码的情况下实现这一点的唯一方法是使用inomap := make(map [interface{}] ino_entry)然后使用类型断言访问元素(尽管我不知道正确的语法)。

有没有办法根据另一个变量、结构或接口成员的静态类型来声明变量的类型,而无需显式地对该类型进行硬编码?

4

3 回答 3

2

看起来您正在尝试使用反射来确保机器的可移植性。如果是这种情况,您可以使用更好的工具。

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

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

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

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

最后将您的地图创建为map[Ino]ino_entry.

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

您可以在此处阅读有关 go 构建约束的更多信息:http: //golang.org/pkg/go/build/

于 2013-01-07T19:51:50.143 回答
0

参照。OP中的最后一个问题:是的,有一种方法可以根据任何表达式的类型声明变量的类型,而无需硬拷贝表达式的类型:

v := expr // equal to var v typeof(expr); v = expr;

expr还包括您提到的大多数实体,即另一个变量,一个类型为“事物”的结构,但包括接口成员(因为规范中没有提到任何成员)。

不幸的是,这与声明映射类型无关,其中/何时使用的类型文字map[T]U. 这里两者TU 不能像上面讨论的短变量声明那样被推断出来

于 2013-01-07T06:59:44.557 回答
0

Stat_t对于任何机器都有相同的定义Ino,并且它的字段总是uint64,所以这应该不是问题。

如果有一个编译时操作符来静态获取这个类型,它必须被很好地隐藏。

但是,您可以定义一个类型别名:type ino_id uint64,这对我来说看起来更易读。

于 2013-01-07T06:59:53.093 回答