簡體   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