使用Golang附加到切片时遇到问题。
这是我的代码:
func MatchBeaconWithXY(w http.ResponseWriter, r *http.Request) ([]types.BeaconDataXY, error) {
context := appengine.NewContext(r)
returnBeaconData := []types.BeaconDataXY{}
beacondata, err := GetBeaconData(w, r)
if err != nil {
log.Errorf(context, "error getting beacondata %v", err)
w.WriteHeader(http.StatusInternalServerError)
return nil, err
}
for index, element := range beacondata {
q := datastore.NewQuery("physicalbeacondata").Filter("NamespaceID =", element.NamespaceID).Filter("InstanceID =", element.InstanceID)
beacondatastatic := []types.BeaconDataStatic{}
_, err := q.GetAll(context, &beacondatastatic)
if err != nil {
log.Errorf(context, "cant get query %v", err)
w.WriteHeader(http.StatusInternalServerError)
return nil, err
}
var beacondataXY = new(types.BeaconDataXY)
beacondataXY.NamespaceID = element.NamespaceID
beacondataXY.InstanceID = element.InstanceID
beacondataXY.XCoord = beacondatastatic[0].XCoord
beacondataXY.YCoord = beacondatastatic[0].YCoord
beacondataXY.Distance = element.Distance
returnBeaconData = append(returnBeaconData, beacondataXY...)
log.Infof(context, "beaondataXY tot %v", beacondataXY)
}
beacondataxy.go 包含:
package types
type BeaconDataXY struct {
InstanceID string
NamespaceID string
XCoord float64
YCoord float64
Distance float64
}
错误信息是:
utils.go:139:不能使用beacondataXY(type * types.BeaconDataXY) 在附加中键入[] types.BeaconDataXY
我真的不知道如何在Golang中处理切片,即使在阅读了一些非常有意义的教程之后。我不确定我做错了什么。
我希望有一个包含类型的数组/切片,返回BeaconData属于[]类型。 BeaconDataXY,它应该包含单一类型的BeaconDataXY。
感谢您的帮助。
编辑:
现在代码如下:
func MatchBeaconWithXY(w http.ResponseWriter, r *http.Request) ([]types.BeaconDataXY, error) {
context := appengine.NewContext(r)
//returnBeaconData := []types.BeaconDataXY{}
returnBeaconData := make([]types.BeaconDataXY, 1)
beacondata, err := GetBeaconData(w, r)
if err != nil {
log.Errorf(context, "error getting beacondata %v", err)
w.WriteHeader(http.StatusInternalServerError)
return nil, err
}
for _, element := range beacondata {
q := datastore.NewQuery("physicalbeacondata").Filter("NamespaceID =", element.NamespaceID).Filter("InstanceID =", element.InstanceID)
beacondatastatic := []types.BeaconDataStatic{}
_, err := q.GetAll(context, &beacondatastatic)
if err != nil {
log.Errorf(context, "cant get query %v", err)
w.WriteHeader(http.StatusInternalServerError)
return nil, err
}
var beacondataXY = types.BeaconDataXY{}
beacondataXY.NamespaceID = element.NamespaceID
beacondataXY.InstanceID = element.InstanceID
beacondataXY.XCoord = beacondatastatic[0].XCoord
beacondataXY.YCoord = beacondatastatic[0].YCoord
beacondataXY.Distance = element.Distance
returnBeaconData = append(returnBeaconData, beacondataXY)
//log.Infof(context, "beaondataXY tot %v", beacondataXY)
}
答案 0 :(得分:2)
通过这项任务:
var beacondataXY = new(types.BeaconDataXY)
您正在创建* types.BeaconDataXY类型的变量。只需像这样创建一个新的BeaconDataXY:
var beacondataXY = types.BeaconDataXY{}
当附加到您的数组时,请执行以下操作:
returnBeaconData = append(returnBeaconData, beacondataXY)
" ..."会假设beacondataXY是一个数组,但它不是,你只想将beacondataXY追加到returnBeaconData。有关" ..."的解释,请参见https://golang.org/ref/spec#Appending_and_copying_slices。在这种情况下意味着。
答案 1 :(得分:1)
尝试returnBeaconData = append(returnBeaconData, *beacondataXY)
new()内置函数返回一个指针,你也可以写:
var beacondataXY = types.BeaconDataXY{}