如何将一个二维数组分配给另一个由golang地图控制的二维数组?

如何将一个二维数组分配给另一个由golang地图控制的二维数组?,go,Go,我上周开始学习golang,我正在golang中重写一个python项目。我知道golang基本上没有继承的概念,人们建议使用嵌入。在我的项目中,我有一个名为MyBase的基本结构,一个名为AdvBase的扩展结构,其中嵌入了MyBaseMyBase携带2d数组的映射,每个2d数组都可以通过enum指定的键访问。在另一个文件夹中,我有一个结构TopTeam扩展了AdvBase。文件夹结构如下所示 root |--- main.go |--- base |--- base.go (MyB

我上周开始学习golang,我正在golang中重写一个python项目。我知道golang基本上没有继承的概念,人们建议使用嵌入。在我的项目中,我有一个名为
MyBase
的基本结构,一个名为
AdvBase
的扩展结构,其中嵌入了MyBase
MyBase
携带2d数组的映射,每个2d数组都可以通过enum指定的键访问。在另一个文件夹中,我有一个结构
TopTeam
扩展了
AdvBase
。文件夹结构如下所示

root
|--- main.go
|--- base
     |--- base.go (MyBase struct & AdvBase struct)
     |--- commons.go
|--- team
     |--- topteam
          |--- tt.go (TopTeam struct)
在tt.go中,我初始化了MyBase中定义的映射,我希望这将反映到嵌入MyBase或AdvBase的所有结构中

// base.go
package base

import "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.go
package base

type KIND int

const (
    T1 KIND = 0
    T2 KIND = 1
    T3 KIND = 2
    T4 KIND = 3
) 


// tt.go
package teams

import "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.go
package main

import (
    "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
实例,每个TopTeam维护一个
Tool
的映射,每个
Tool
持有一个矩阵(2d数组),其大小或内容可能会不时变化。我希望地图和工具的地址在创建后保持不变,但是工具持有的数组可以更改。是否可以在go中实现此功能?

您必须更改一些内容:

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

func (t *Tool) SetMat(mat_ [][]int) {
  ...
}
如果没有这一点,
SetMat
将接收一个
t
的副本并对其进行修改,该副本将被丢弃。使用指针接收器,
SetMat
将修改用于调用
SetMat
t
实例

然后,您需要将地图更改为存储
*工具
,而不是
工具

   myTool map[KIND]*Tool
否则,
myTool[x]
将返回
Tool
的副本,而不是指向存储在映射中的
Tool
实例的指针

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

func (b MyBase) SetTool( k KIND, mat [][]int) {
    t:=b.myTool[k]
    if t==nil {
       t=&Tool{}
       b.myTool[k]=t
    }
    t.SetMat(mat)
}