Golang 切片追加
Posted
技术标签:
【中文标题】Golang 切片追加【英文标题】:Golang slices append 【发布时间】:2017-06-17 00:17:08 【问题描述】:我在使用 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)
【问题讨论】:
【参考方案1】:有了这个任务:
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 了解“...”在此上下文中的含义。
【讨论】:
已根据该更新但仍然与我在其他解决方案中回答的问题相同。索引超出范围 请发布完整的堆栈跟踪。 如何查看堆栈跟踪?还是堆栈跟踪整个错误输出? imgur.com/wMj90Fz 在此处查看之前的评论,发布了带有整个堆栈跟踪的 imgur 链接 handlers/utils.go 的第 136 行是什么?【参考方案2】:试试returnBeaconData = append(returnBeaconData, *beacondataXY)
new() 内置函数返回一个指针,你也可以这样写:
var beacondataXY = types.BeaconDataXY
【讨论】:
http: panic serving 127.0.0.1:56095: runtime error: index out of range goroutine 7 [running]:returnBeaconData
是一个切片。索引超出范围发生在数组中。
我遇到了这个问题,我想我已经做了我所做的以摆脱索引越界错误。虽然它不起作用
但是后来发生了什么?更改您所说的内容时错误索引超出范围?
@SimonNilssonGuldstrand 1389 是行号以上是关于Golang 切片追加的主要内容,如果未能解决你的问题,请参考以下文章