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