我正在尝试将一个数组追加到另一个数组(或切片以构造?) 根据先前的查询结果,对查询(目标)的结果进行迭代,并附加来自另一个查询(每个检查点的目标)的结果。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 未定义(type.Target类型没有AddItem方法)
上面的代码是否有问题?
答案 0 :(得分:1)
target = model.Target.AddItem(targetCheck)
是错误的,您应该在从target
语句获得的range
值上调用方法,因此&target.AddItem(targetCheck)
代替
答案 1 :(得分:0)
该错误清楚地表明:
vendor \ app \ controller \ criteria.go:74:24:无效的方法表达式 model.Target.AddItem(需要指针接收器:(* model.Target).AddItem)
vendor \ app \ controller \ criteria.go:74:24:model.Target.AddItem 未定义(type.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规范中对Method Declaration进行了描述:
接收器是通过在 方法名称。该参数部分必须声明一个非变量 参数,接收者。其类型必须为T或* T (可能使用括号),其中T是类型名称。表示的类型 用T表示的是接收方基本类型;它不能是指针或 接口类型,它必须与 方法。据说该方法绑定到基本类型和方法 名称仅在类型T或* T的选择器中可见。
给出Point类型,声明:
func(p * Point)Length()float64 { 返回math.Sqrt(p.x * p.x + p.y * p.y) }
func (p *Point) Scale(factor float64) {
p.x *= factor
p.y *= factor
}
将接收器类型为* Point的方法Length和Scale绑定到 基本类型Point。