当前位置: 首页 > 面试题库 >

访问映射值内的结构字段(无复制)

戚阳文
2023-03-14
问题内容

假设以下

type User struct {
    name string
}

users := make(map[int]User)

users[5] = User{"Steve"}

为什么无法访问现在存储在映射中的struct实例?

users[5].name = "Mark"

任何人都可以阐明如何访问映射存储的结构,或为何无法访问它的逻辑?

笔记

我知道您可以通过复制结构,更改副本并将其复制回到地图中来实现这一点-但这是一项昂贵的复制操作。

我也知道这可以通过在我的地图中存储结构指针来完成,但是我也不想这样做。


问题答案:

根本问题是您无法获取地图中某物的地址。您可能会认为编译会重新安排users[5].name = "Mark"

(&users[5]).name = "Mark"

但这不能编译,给出此错误

cannot take the address of users[5]

这是为了让地图可以自由地随意重新排序,以有效地使用内存。

更改地图中实际内容的唯一方法是分配给地图,即

t := users[5]
t.name = "Mark"
users[5] = t

因此,我认为您要么必须使用上述副本,要么必须将指针存储在地图中。存储指针的缺点是使用更多的内存和更多的内存分配,这可能超过上面的复制操作-
只有您和您的应用程序才能知道这一点。

第三种选择是使用切片-如果您将原始语法更改users := make(map[int]User)users := make([]User, 10)



 类似资料:
  • Navicat 会依源表或集合对字段类型和长度作出假设。你可以从下拉式列表选择你所需的类型。 【提示】导入多个表或集合时,你可以从“源表”或“源集合”下拉式列表选择其他表或集合。 如果你导入数据到现有的表或集合,你则需要手动映射源字段名到目标,或右击并从弹出式菜单选择“智慧配对全部字段”、“直接匹配全部字段”和“全部取消匹配”来进行快速匹配。 如果你透过 ODBC 导入,“条件式查询”按钮会打开“

  • Navicat 会依源表或集合对字段类型和长度作出假设。你可以从下拉式列表选择你所需的类型。 【提示】导入多个表或集合时,你可以从“源表”或“源集合”下拉式列表选择其他表或集合。 如果你导入数据到现有的表或集合,你则需要手动映射源字段名到目标,或右击并从弹出式菜单选择“智慧配对全部字段”、“直接匹配全部字段”和“全部取消匹配”来进行快速匹配。

  • 问题内容: 我有这样的数据结构: 是另一个结构。 然后,当我尝试在Users切片中添加一些新值时,如下所示: 我不断收到此错误: 还尝试在这里https://github.com/golang/go/issues/3117变通方法,像这样: 但是没有运气,仍然是完全相同的错误。 并且还尝试使用指针声明地图,因此:,仍然没有运气。 问题答案: 首先,对于这个问题,本文中的解决方案为什么在将值设置为结

  • 问题内容: 我想在结构上定义一个方法来验证http请求。但是我在访问结构域时遇到一些问题。 有我的代码。 运行此代码时,得到以下结果 有什么方法可以访问Validate2()方法上的Validate()方法上的结构字段? 问题答案: 您不能从内部结构访问外部结构字段。仅内部字段来自外部。您可以做的是:

  • 我目前使用的日志记录系统使用一个标记值来标识它将存储的参数。我们正在使用的格式如下:标签+时间+值。 不要忘记结构的每个字段可能具有不同的类型。

  • 问题内容: 示例代码: 问题行: 错误: 题: 那么,如何访问该界面内的键? 我是否需要使用方法集定义更复杂的接口来完成此操作? 问题答案: 由于您的分片类型为,因此索引该分片将为您提供type的元素。类型的值无法建立索引。 但是由于您将类型的值放入其中,因此可以使用类型断言来获取该映射类型的值,您可以对其进行正确索引: 输出(在Go Playground上尝试): 如果您知道总是将类型的值存储在