2017-01-31 36 views
1

我在使用Golang追加到切片时遇到问题。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: cannot use beacondataXY (type *types.BeaconDataXY) as type []types.BeaconDataXY in append

我真的不知道如何处理Golang中的切片,即使阅读了一些使p版本的教程错误的感觉。我不确定我做错了什么。

我想有一个数组/切片里面的类型,返回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) 
    } 

回答

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以解释在这种情况下“......”的含义。

+0

根据那个更新,但仍然是相同的问题,因为我在另一个解决方案中回答。索引超出范围 –

+0

请发布完整的堆栈跟踪。 – Makkes

+0

如何查看堆栈跟踪?或者是堆栈跟踪整个错误输出? http://imgur.com/wMj90Fz –

1

尝试returnBeaconData = append(returnBeaconData, *beacondataXY)

新()内置函数返回一个指针,则可以选择写:

var beacondataXY = types.BeaconDataXY{}

+0

http:panic serving 127.0.0.1:56095:runtime error:index out of range goroutine 7 [running]: –

+0

'returnBeaconData'是一个分片。索引超出范围发生在数组中。 –

+0

我有这个问题,我想我做了什么我摆脱索引出界的错误。虽然它不起作用 –