gpt4 book ai didi

map - 获取结构元素的静态类型

转载 作者:IT王子 更新时间:2023-10-29 00:46:47 30 4
gpt4 key购买 nike

我查看了 Golang 文档,但没有看到有关如何实现我想要做的事情的示例。具体来说,我正在尝试从 inode 编写一个映射,由 syscall.Stat_t.Ino 表示,在我的机器上具有 uint64 类型,到 ino_entry,定义为

type ino_entry struct {
st *syscall.Stat_t
nodes []string
}

其中 nodes 代表硬链接(hard link)到 inode 的所有文件的名称。

但是,如果可以的话,我想避免将文字类型 uint64 放在 map 的规范中。也就是说,与其编写 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) 然后使用访问元素类型断言(虽然我不知道正确的语法)。

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

最佳答案

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

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

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

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

然后在该文件中为适合该架构的类型添加一个类型别名:type Ino uint64

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

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

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

关于map - 获取结构元素的静态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191043/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com