我上周开始学习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)
}
- 1 回答
- 0 关注
- 66 浏览
添加回答
举报
0/150
提交
取消