为了账号安全,请及时绑定邮箱和手机立即绑定

如何将一个2d数组分配给另一个由golang中的地图持有的2d数组?

如何将一个2d数组分配给另一个由golang中的地图持有的2d数组?

Go
萧十郎 2022-08-24 11:39:21
我上周开始学习golang,我正在用golang重写一个python项目。我知道golang基本上没有继承的概念,人们建议使用嵌入代替。在我的项目中,我有一个名为 的基础结构,一个名为 MyBase 的扩展结构。 携带2d数组的映射,每个2d数组都可以通过枚举指定的键访问。在另一个文件夹中,我有一个扩展.文件夹结构如下所示MyBaseAdvBaseMyBaseTopTeamAdvBaseroot|--- main.go|--- base     |--- base.go (MyBase struct & AdvBase struct)     |--- commons.go|--- team     |--- topteam          |--- tt.go (TopTeam struct)在tt.go中,我初始化了MyBase中定义的映射,我希望它将反映在嵌入了MyBase或AdvBase的所有结构中。// base.gopackage baseimport "fmt"type MyBase struct {    max_num int    myTool map[KIND]Tool}func (b MyBase) SetTool( k KIND, mat [][]int) {    b.myTool[k].SetMat(mat)}func (b MyBase) ShowTool(k KIND) {    b.myTool[k].Show()}type AdvBase struct {    MyBase}func NewAdvBase(max_num_ int) *AdvBase {    ab := AdvBase{MyBase{max_num: max_num_}}    return &ab}type Tool struct {    mat [][]int}func (t Tool) SetMat(mat_ [][]int) {    t.mat = mat_}func (t Tool) Show() {    fmt.Println(t.mat)}// commons.gopackage basetype KIND intconst (    T1 KIND = 0    T2 KIND = 1    T3 KIND = 2    T4 KIND = 3) // tt.gopackage teamsimport "base"type TopTeam struct {    base.AdvBase}func NewTeam(k_ int) *TopTeam {    p := base.NewAdvBase(k_)    tt := TopTeam{*p}    T2 := base.T2    // I assign the 2d array holding by the map with key=T2    tt.SetTool(T2, [][]int {{1,2,3,4},          {4,5,6},{7,8,9,10,11}})    return &tt}// main.gopackage mainimport (    "base"    teams "team/topteam")func main() {    pp := teams.NewTeam(3) // calling this should issue tt.SetTool    pp.ShowTool(base.T2) // so this line should show the assigned array}但是,在运行代码后,key=T2 的数组始终为空。我整个下午都在调试这个问题,但仍然不知道代码出了什么问题。在运行时,程序中最多可以创建 10 个实例,每个 TopTeam 维护一个 映射,并且每个实例都保存一个矩阵(2d 数组),其大小或内容可能会不时更改。我希望在创建映射和工具后保持它们的地址不变,但是工具持有的数组可以更改。是否可以在 go 中实现此功能?TopTeamToolTool
查看完整描述

1 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

您必须更改一些内容:


首先,您需要更改以使用指针接收器:SetMat


func (t *Tool) SetMat(mat_ [][]int) {

  ...

}

没有它,接收并修改它的副本,然后被丢弃。使用指针接收器,将修改用于调用 的实例。SetMattSetMattSetMat


然后,您需要更改要存储的地图,而不是:*ToolTool


   myTool map[KIND]*Tool

否则,将返回 的副本,而不是指向映射中存储的实例的指针。myTool[x]ToolTool


然后,您必须更改映射的初始化位置。使用当前设置时,映射具有按值,因此,如果映射中不包含元素,则返回一个空实例。使用指针时,该空实例将为 nil,从而导致紧急。Tool


func (b MyBase) SetTool( k KIND, mat [][]int) {

    t:=b.myTool[k]

    if t==nil {

       t=&Tool{}

       b.myTool[k]=t

    }

    t.SetMat(mat)

}


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信