如何防止类型被用作映射键?

2023-12-14

我有一个可以用作映射键的类型,但我想防止这种情况发生。我假设如果该类型包含私有成员,则不可能从其他包中获得该成员,但这似乎仍然有效。使该类型无法用作地图键的最佳方法是什么?

type MyType struct {
    A *A
    b b

    preventUseAsKey ?
}

我没有看到禁止将类型用作键的任何好处。它只是一个可能使用也可能不使用的选项,类型不会因为您禁止将其用作地图键而变得更好、更小或更快。

但如果你想这样做:规格: 地图类型:

The 比较运算符== 和 != 必须为键类型的操作数完全定义;因此键类型不能是函数、映射或切片。

因此,如果您违反了比较运算符,你隐含地得到了你想要的。你有一个struct,术语为struct types:

如果结构体的所有字段都可比较,则结构体值也可比较。如果两个结构体值对应的非blank字段是相等的。

So struct仅当所有字段都可比较时,值才可比较(因此只能用作映射中的键)。只需添加一个类型不可比较的字段即可。

切片、贴图和函数值不具有可比性。

例如,添加一个类型为切片的字段,然后就完成了:

type MyType struct {
    S             string
    i             int
    notComparable []int
}

尝试使用上面的MyType作为关键:

m := map[MyType]int{}

你会得到一个编译时错误:

invalid map key type MyType

Note:

我写过禁止类型作为密钥没有任何好处。不仅如此:从现在开始,您将无法再对您的类型的值使用比较运算符(因为存在额外的不可比较字段),因此例如您将失去比较这些值的选项:

p1, p2 := MyType{}, MyType{}
fmt.Println(p1 == p2)

编译时错误:

invalid operation: p1 == p2 (struct containing []int cannot be compared)

请注意,通过一些小技巧,您仍然可以保留类型的可比较性质,例如不导出您的类型,而是导出嵌入原始类型的包装类型;并将额外的、不可比较的类型添加到包装类型中,例如:

type myType struct {
    S string
    i int
}

type MyType struct {
    myType
    notComparable []int
}

func main() {
    p1, p2 := MyType{}, MyType{}
    fmt.Println(p1.myType == p2.myType)
}

这样你的myType可以保持可比性,但仍然阻止导出、包装MyType用作键类型的类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止类型被用作映射键? 的相关文章

随机推荐

  • R:创建(长)虚拟列表时发出警告

    列的虚拟列c和给定值x equals 1 if c x还有 0 个 通常 通过为列创建虚拟对象c 1 排除一个值x根据选择 因为最后一个虚拟列不会添加任何信息 已经存在的虚拟列 以下是我尝试为专栏创建一长串虚拟对象的方法firm in a
  • Swift 3 NTLM 身份验证

    在最近的一个项目中 我尝试分别以 SOAP 和 oData 格式从服务器中提取一些数据 这些数据受到 Microsoft NTLM 身份验证的保护 并且弄清楚如何做到这一点是一场噩梦 没有一个在线示例真正起作用 这是我的解决方案 我必须适应
  • 当我开始搜索时,UISearchController 中的 UISearchBar 消失了。为什么?

    这就是我设置我的UIsearchController private func setupSearchController let searchResultsController storyboard instantiateViewCont
  • 通过谷歌脚本保存为CSV处理换行符

    因此 我尝试从 Google 电子表格中获取一张工作表并将其另存为 CSV 文件 就像您可以手动执行的操作一样 它工作得相当好 但我遇到了新行 换行 回车等问题 我已经使用和修改了谷歌的解决方案到目前为止 一些堆栈溢出资源已经满足了我的需求
  • 如何使用 UML 类图表示通过另一个类对一个类的调用

    在 Android 中 假设我们有 2 个类 它们具有启动服务的通用方法 因此我们将它们提取到辅助类中 下图显示了我尝试表示它的奇怪尝试 我已经使用了交易范围缩小 我认为这些是用于活动图的 但是在uml diagrams org class
  • 我可以在同一个 Xcode 项目中拥有 Swift、Objective-C、C 和 C++ 文件吗?

    是否可以在同一个项目中使用所有 4 种语言 如果可以 如何使用 有similar风味问题 我可以将 Swift 与 C 混合使用吗 就像 Objective C mm 文件一样接受的答案是no Using Bridging Header充分
  • Python:itertools.product() 的更快替代方案?

    我试图找到长度 22 且元素值 1 9 的列表的所有可能组合 当我使用 i for i in itertools product range 1 10 repeat 22 Python崩溃 Python 有更快的替代方案吗 正如大家评论的那
  • Windows Phone 模拟器无法连接到 Windows Phone 操作系统

    当我运行我的应用程序时出现此消息 Windows Phone 模拟器无法连接到 Windows Phone 操作系统 电话未响应连接请求 某些功能可能会被禁用 搜索后我找到了这个答案 打开 Hyper V 管理器 左栏 左键单击您的计算机名
  • 为什么使用 gems 来提供资产而不是供应商文件?

    我对 Rails 比较陌生 我有一个关于从 gem 提供资产与仅将文件加载到资产管道中的问题 据我所知 它们实际上做了相同的事情 因为它们都使文件在资产管道中可用 以便在清单中调用 提供类似服务有什么优势 gem jquery rails
  • 映射数组返回 [object Object]

    我有一个Keypad组件 每次按下按钮时 它都应该将该按钮的值添加到数组中 var keys this props keys map function k index return tr td td tr
  • 单击一次后禁用按钮

    我需要在单击按钮后将其禁用 以便用户不能多次单击它 我的应用程序是用 MVC ASP NET 编写的 我在普通的 ASP NET 应用程序中完成了此操作 我尝试使用 JavaScript 和 jQuery 但它不起作用 该按钮被禁用 但表单
  • 如何在 yocto 中编译基本的 c 文件

    我正在 yocto 上工作 我想在 yocto 中编译一些 C 文件并将生成的二进制文件安装到外部文件系统 在此之前 我尝试创建一个单独的记录并从中编译 C 代码 我无法编译它 我不确定是否理解这个问题 因为它不够精确 在配方树中包含 C
  • R gsub 从 x 列中的单词中删除 y 列中的单词

    我正在尝试使用 gsub 删除 y 列中 x 列中的单词 文本 x c a b c y c asometext some a b text c a text df cbind x y df data frame df df y gsub d
  • 反应状态没有立即更新

    React 状态不会立即更新 我想在按下 播放 按钮后立即更新状态 import as React from react import Button from react native export default function Pla
  • SVG 旋转动画在 IE 和 FF 中失败

    我正在努力使用 SVG 制作一个简单的加载旋转元素 它在 Chrome 中运行良好 但在其他浏览器中则不然 在 IE 中 动画根本不起作用 更麻烦的是 在 FF 中 动画可以工作 但旋转没有集中在正确的位置 我该怎么做才能让它在 FF 中正
  • 带有捆绑包的应用程序小部件?

    大家好 我有应用程序小部件 我想通过单击小部件将一些数据发送到附加到 PendingIntent 的意图 这是我的代码 final int N appWidgetIds length for int i 0 i lt N i int app
  • 按钮悬停时的菜单

    我正在尝试为 WordPress 主题制作菜单 但遇到了一些麻烦 我希望菜单隐藏并仅在我们悬停按钮时显示 菜单是同级 div 的子级 如下所示 div div class menu div 我怎样才能使用 CSS 来做到这一点 以便当我将鼠
  • 合并两个具有重复列的数据框

    我有几个 csv 文件 每个文件都对应每月的客户列表以及有关他们的一些信息 每个文件都包含有关客户的相同信息 例如 names data jan ID AGE CITY GENDER names data feb ID AGE CITY G
  • PHP MVC:控制器中有太多依赖项?

    我正在开发一个个人 HMVC 项目 没有服务定位器 没有全局状态 比如static or global 没有单身人士 模型处理封装在服务中 服务 域对象 存储库 数据映射器 所有控制器都扩展一个抽象控制器 所有项目依赖项都通过注入Auryn
  • 如何防止类型被用作映射键?

    我有一个可以用作映射键的类型 但我想防止这种情况发生 我假设如果该类型包含私有成员 则不可能从其他包中获得该成员 但这似乎仍然有效 使该类型无法用作地图键的最佳方法是什么 type MyType struct A A b b prevent