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