繁体   English   中英

将切片附加到Golang中的结构

[英]Append Slice to Struct in Golang

我正在尝试将一个数组追加到另一个数组(或将切片切片到struct?),对查询(目标)的结果进行迭代,并根据先前的查询result.id将另一个查询的结果(每个检查点的目标)追加

然后,将结果迭代到模板中。

模型

type Target struct {
    ID              uint32        `db:"id"`
    CriteriaID      string        `db:"criteria_id"`
    TargetCheck     []*TargetCheck
}

type TargetCheck struct {
    ID              uint32        `db:"id"` 
    TargetID        string        `db:"target_id"`
    CheckpointID    template.HTML `db:"checkpoint_id"`
    Name            string        `db:"name"`
}

func TargetByCriteriaID(criteriaID string) ([]Target, error) {
... <return rows> 
}

func CheckpointByTargetID(targetID uint32) ([]TargetCheck, error) {
... <return rows>
}

func (target *Target) AddItem(TargetCheckItem *TargetCheck) []*TargetCheck {
    target.TargetCheck = append(target.TargetCheck, TargetCheckItem)
    return target.TargetCheck
}

调节器

func CriteriaBrowseGET(w http.ResponseWriter, r *http.Request) {

criteriaID := 5
target, err := model.TargetByCriteriaID(criteriaID)
for i := range target {
        targetCheck, err := model.CheckpointByTargetID(target[i].ID)
        target = model.Target.AddItem(targetCheck)
    }

v := view.New(r)
v.Name = "criteria/browse"
v.Vars["target"] = target
v.Render(w)

}

视图

{{range $index, $content := .target}}
    <p>Target: {{.ID}}</p>
                    {{if .}}
                        {{range .TargetCheck}}
                            <p>{{.CheckpointID}}</p>
                            <p>{{.Name}}</p>
                        {{end}}
                    {{end}}

{{end}}

执行go build会显示:

vendor \\ app \\ controller \\ criteria.go:74:24:无效的方法表达式model.Target.AddItem(需要指针接收者:(* model.Target).AddItem)

vendor \\ app \\ controller \\ criteria.go:74:24:model.Target.AddItem未定义(model.Target类型没有方法AddItem)

上面的代码有什么问题吗?

target = model.Target.AddItem(targetCheck)是错误的,您应该在从range语句获得的target上调用一个方法,所以&target.AddItem(targetCheck)代替

该错误清楚地表明:

vendor \\ app \\ controller \\ criteria.go:74:24:无效的方法表达式model.Target.AddItem(需要指针接收者:(* model.Target).AddItem)

vendor \\ app \\ controller \\ criteria.go:74:24:model.Target.AddItem未定义(model.Target类型没有方法AddItem)

您在此处具有指向方法AddItem指针接收器:

func (target *Target) AddItem(TargetCheckItem *TargetCheck) []*TargetCheck {
    target.TargetCheck = append(target.TargetCheck, TargetCheckItem)
    return target.TargetCheck
}

但是,当您从控制器调用函数时,您正在使用值接收器:

    targetCheck, err := model.CheckpointByTargetID(target[i].ID)
    target = model.Target.AddItem(targetCheck)

调用函数AddItem时,您应该传递指针接收器。

操场上的例子

在Golang规范中对方法声明进行了描述:

接收器是通过方法名称前面的附加参数部分指定的。 该参数部分必须声明一个非可变参数,即接收器。 其类型必须为T或* T形式(可能使用括号),其中T为类型名称。 用T表示的类型称为接收方基本类型; 它不能是指针或接口类型,并且必须在与方法相同的程序包中定义。 据说该方法绑定到基本类型,并且方法名称仅在类型T或* T的选择器中可见。

给定类型Point,声明:

func(p * Point)Length()float64 {return math.Sqrt(px * px + py * py)}

func (p *Point) Scale(factor float64) {
    p.x *= factor
    p.y *= factor
}

将接收器类型为* Point的方法Length和Scale绑定到基本类型Point。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM