首页 > 其他分享 >golang—踩坑之切片

golang—踩坑之切片

时间:2024-04-03 11:56:13浏览次数:22  
标签:切片 err resp global golang Println SlsMessages fmt

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

标签:切片,err,resp,global,golang,Println,SlsMessages,fmt
From: https://www.cnblogs.com/fuyuteng/p/18112386

相关文章

  • 由浅到深认识Go语言(8):切片
    该文章Github地址:https://github.com/AntonyCheng/go-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况下推荐直......
  • golang中GORM使用 many2many 多对多关联查询-详细案例
    表结构和数据user表CREATETABLE`user`(`id`bigint(20)NOTNULL,`user_key`bigint(20)NOTNULL,`account`char(32)NOTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;为了测试将user_key和id写入同样的值数据:+----+----------+---------+|id|user_k......
  • Golang | Leetcode Golang题解之第4题寻找两个正序数组的中位数
    题目:题解:funcfindMedianSortedArrays(nums1[]int,nums2[]int)float64{iflen(nums1)>len(nums2){returnfindMedianSortedArrays(nums2,nums1)}m,n:=len(nums1),len(nums2)left,right:=0,mmedian1,median2:=0,0......
  • golang语言系列:Scrum、Kanban等敏捷管理策略
    云原生学习路线导航页(持续更新中)本文是golang语言系列文章,主要对编程通用技能Scrum、Kanban等敏捷管理策略进行学习1.什么是敏捷开发敏捷是一个描述软件开发方法的术语,它强调增量交付、团队协作、持续规划和持续学习。2001年,敏捷宣言提出:个体和交互胜过流程和......
  • python golang 安装私有库的用法
    python安装在requirements.txt增加了github私有安装库的依赖git+https://${GITHUB_TOKEN}@github.com/YOLOTECHNOLOGY/bossjob-auth-lib.git@${GITHUB_LIB_BRANCH}当前该库无法通过pipenv直接安装,需要进入到虚拟环境,通过pipinstall进行安装安装前需要设置GITHUB_......
  • NumPy库中的ndarray对象——ndarray的切片和索引
    一、普通切片与索引ndarray对象的内容可以通过索引或切片来访问和修改,与Python中list的切片操作一样。ndarray数组可以基于0-n的下标进行索引,切片对象可以通过内置的slice函数,并设置start,stop及step参数进行,从原数组中切割出一个新数组。我们来介绍一下sta......
  • 如何实现Python中的字符串切片?
    如何实现Python中的字符串切片?在Python中,字符串切片是一种强大的功能,它允许我们访问和操作字符串中的特定部分。字符串切片的基本语法是[start:stop:step],其中start是切片的起始索引,stop是切片的结束索引(但不包括该索引处的字符),step是切片时每次跳过的字符数。如果省略某个参......
  • golang: 分析查看汇编代码
    golang:分析查看汇编代码查看可执行文件可视化注意:linux用户需要额外运行goinstall--tagsnowaylandloov.dev/lensm@main​下载lensm:goinstallloov.dev/lensm@main运行lensm​:lensm.\main.exe​效果:​​Gobuild​gobuild-gcflags-S.\main.go​......
  • golang学习路线
    golang学习路线学习Golang的路线可以分为以下几个阶段:基础语法:了解Golang的基本语法结构,包括变量声明、控制流、函数、指针等。数据类型:熟悉Golang的基本数据类型,如整型、浮点型、字符串、数组、切片、Map等。并发编程:学习Golang的并发编程特性,包括goroutines、channels和互斥......
  • golang 读取文件内容,清空文件内容,把读取的内容写入到文件里
    packagemainimport( "encoding/json" "fmt" "io" "log" "os")typePvRelationListstruct{ Item[]PvRelationInfo`json:"item"`}typePvRelationInfostruct{ PodNamestring`json:"p......