golang—踩坑之切片

1.记录一次切片引用错误,希望大家不要踩坑,用来惊醒自己!

修改之前:

import (
    "context"
    "encoding/json"
    "feishu/global"
    "feishu/structure"
    "feishu/utils"
    "fmt"
    "github.com/gin-gonic/gin"
    larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
    "log"
)

func GetMessage(c *gin.Context) {
    // 创建 Client
    client := utils.GetSecret()
    // 初始化 PageToken
    var pageToken string
    // 循环获取数据直到没有更多数据

    for {
        // 创建请求对象
        req := larkim.NewListMessageReqBuilder().
            ContainerIdType(`chat`).
            ContainerId(`oc_6731c834c3070d329fea76ac176f6076`).
            StartTime(`1711382400`).
            EndTime(`1712110005`).
            SortType(`ByCreateTimeAsc`).
            PageSize(50).
            PageToken(pageToken). // 更新请求中的 PageToken
            Build()

        // 发起请求
        resp, err := client.Im.Message.List(context.Background(), req)

        // 处理错误
        if err != nil {
            fmt.Println(err)
            return
        }

        // 服务端错误处理
        if !resp.Success() {
            fmt.Println(resp.Code, resp.Msg, resp.RequestId())
            return
        }
        // 业务处理
        //fmt.Println(larkcore.Prettify(resp.Data))
        marshal, _ := json.Marshal(resp.Data)

        err = json.Unmarshal(marshal, &global.MessageResponse)
        log.Println(err)
        global.SlsMessages = append(global.SlsMessages, global.MessageResponse)
        fmt.Println("打印数组:", global.MessageResponse)
        // 更新 PageToken
        pageToken = *resp.Data.PageToken
        // 如果没有更多数据,则退出循环
        if !*resp.Data.HasMore {
            break
        }
    }
    //fmt.Println("打印数据:", global.SlsMessages)
    c.JSON(200, gin.H{
        "code": 200,
        "data": global.SlsMessages,
    })
}

修改之后:

由于你每次都使用同一个全局变量 global.SlsMessage,所以在追加到 global.SlsMessages 切片中时,实际上是追加了同一个对象的引用,而不是它的副本。这意味着在追加后对 global.SlsMessage 所做的任何更改都会反映在 global.SlsMessages 的所有元素中。

package core

import (
    "context"
    "encoding/json"
    "feishu/global"
    "feishu/structure"
    "feishu/utils"
    "fmt"
    "github.com/gin-gonic/gin"
    larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
    "log"
)

func GetMessage(c *gin.Context) {
    // 创建 Client
    client := utils.GetSecret()
    // 初始化 PageToken
    var pageToken string
    // 循环获取数据直到没有更多数据

    for {
        // 创建请求对象
        req := larkim.NewListMessageReqBuilder().
            ContainerIdType(`chat`).
            ContainerId(`oc_6731c834c3070d329fea76ac176f6076`).
            StartTime(`1711382400`).
            EndTime(`1712110005`).
            SortType(`ByCreateTimeAsc`).
            PageSize(50).
            PageToken(pageToken). // 更新请求中的 PageToken
            Build()

        // 发起请求
        resp, err := client.Im.Message.List(context.Background(), req)

        // 处理错误
        if err != nil {
            fmt.Println(err)
            return
        }

        // 服务端错误处理
        if !resp.Success() {
            fmt.Println(resp.Code, resp.Msg, resp.RequestId())
            return
        }
        // 业务处理
        //fmt.Println(larkcore.Prettify(resp.Data))
        marshal, _ := json.Marshal(resp.Data)
        var SlsMessage structure.MessageResponse
        err = json.Unmarshal(marshal, &SlsMessage)
        log.Println(err)
        global.SlsMessages = append(global.SlsMessages, SlsMessage)
        fmt.Println("打印数组:", SlsMessage)
        // 更新 PageToken
        pageToken = *resp.Data.PageToken
        // 如果没有更多数据,则退出循环
        if !*resp.Data.HasMore {
            break
        }
    }
    //fmt.Println("打印数据:", global.SlsMessages)
    c.JSON(200, gin.H{
        "code": 200,
        "data": global.SlsMessages,
    })
}

 

import ("context""encoding/json""feishu/global""feishu/structure""feishu/utils""fmt""github.com/gin-gonic/gin"larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1""log")
func GetMessage(c *gin.Context) {// 创建 Clientclient := utils.GetSecret()// 初始化 PageTokenvar pageToken string// 循环获取数据直到没有更多数据
for {// 创建请求对象req := larkim.NewListMessageReqBuilder().ContainerIdType(`chat`).ContainerId(`oc_6731c834c3070d329fea76ac176f6076`).StartTime(`1711382400`).EndTime(`1712110005`).SortType(`ByCreateTimeAsc`).PageSize(50).PageToken(pageToken). // 更新请求中的 PageTokenBuild()
// 发起请求resp, err := client.Im.Message.List(context.Background(), req)
// 处理错误if err != nil {fmt.Println(err)return}
// 服务端错误处理if !resp.Success() {fmt.Println(resp.Code, resp.Msg, resp.RequestId())return}// 业务处理//fmt.Println(larkcore.Prettify(resp.Data))marshal, _ := json.Marshal(resp.Data)
err = json.Unmarshal(marshal, &global.MessageResponse)log.Println(err)global.SlsMessages = append(global.SlsMessages, global.MessageResponse)fmt.Println("打印数组:", global.MessageResponse)// 更新 PageTokenpageToken = *resp.Data.PageToken// 如果没有更多数据,则退出循环if !*resp.Data.HasMore {break}}//fmt.Println("打印数据:", global.SlsMessages)c.JSON(200, gin.H{"code": 200,"data": global.SlsMessages,})}
posted @ 2024-04-03 11:49  努力乄小白  阅读(22)  评论(0编辑  收藏  举报