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 切片追加的主要内容,如果未能解决你的问题,请参考以下文章

golang 将两个切片追加在一起

奇怪的golang“追加”行为(覆盖切片中的值)

Golang 从切片追加函数“已评估但未使用”中删除 dup ints

golang数组与切片

附加到作为空接口传递的 golang 切片

Golang M 2023 4 topic