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

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


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


萧十郎
浏览 67回答 1
1回答

梦里花落0921

您必须更改一些内容:首先,您需要更改以使用指针接收器:SetMatfunc (t *Tool) SetMat(mat_ [][]int) {  ...}没有它,接收并修改它的副本,然后被丢弃。使用指针接收器,将修改用于调用 的实例。SetMattSetMattSetMat然后,您需要更改要存储的地图,而不是:*ToolTool   myTool map[KIND]*Tool否则,将返回 的副本,而不是指向映射中存储的实例的指针。myTool[x]ToolTool然后,您必须更改映射的初始化位置。使用当前设置时,映射具有按值,因此,如果映射中不包含元素,则返回一个空实例。使用指针时,该空实例将为 nil,从而导致紧急。Toolfunc (b MyBase) SetTool( k KIND, mat [][]int) {    t:=b.myTool[k]    if t==nil {       t=&Tool{}       b.myTool[k]=t    }    t.SetMat(mat)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go