golang—踩坑之切片

努力乄小白發表於2024-04-03

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,})}

相關文章