正确使用 Golang 循环创建新切片的方式

简介: 正确使用 Golang 循环创建新切片的方式

最近在使用 Golang 开发 Web 应用时,碰到一个问题。

我编写了一个用于过滤人员认证列表的接口。


http://127.0.0.1:11088/api/v1/person-auths?status=0,2

其中 status 字段是一个过滤条件。比如 0,2 就是查询所有 status 为 0 和 2 的人员认证记录。

在 gin 框架中,可以使用 ctx.Query 获取到 status 对应的字符串。


statusStr := ctx.Query("status")// 1,2

业务逻辑层的查询参数结构体类型定义的是这样的:


type PersonAuthQueryParam struct {
  Status    []int
  // ...
}

所以我需要将字符串 1,2 转换为 int 类型的切片 [1, 2]

按照 JavaScript 的习惯,这非常简单。


statusStr := "1,2"
statusStrs := strings.Split(statusStr, ",")
var statusInts []int
for i, v := range statusStrs {
    vInt, err := strconv.Atoi(v)
    if err != nil {
        return err
    }
    statusInts[i] = vInt
}

逻辑上是将字符串以 , 分割为一个 string 切片,然后创建一个空的 int 切片。 遍历 string 切片,将每一个元素的类型转换为 int,并赋值给 int 切片对应的下标上面。

但是在实际运行时,会得到一个 runtime error。


panic: runtime error: index out of range [0] with length 0

这是一个标准的数组越界问题。

因为此时的 int 切片是空切片,长度和容量都为 0。


fmt.Printf("%v\n", len(statusInts))// 0
fmt.Printf("%v\n", cap(statusInts))// 0
fmt.Printf("%v\n", statusInts == nil)// true

解决的方法有两种。

第一种是换一种添加元素的方式。

使用 append 函数添加元素,它会自动扩容。


statusInts = append(statusInts, vInt)

第二种是换一种初始化切片的方式,给切片设置一个 length。


statusInts := make([]int, len(statusStrs))



相关文章
|
Go
Golang切片copy踩坑
Golang切片copy踩坑
153 0
|
5月前
|
存储 Java Go
【Golang】(3)条件判断与循环?切片和数组的关系?映射表与Map?三组关系傻傻分不清?本文带你了解基本的复杂类型与执行判断语句
在Go中,条件控制语句总共有三种if、switch、select。循环只有for,不过for可以充当while使用。如果想要了解这些知识点,初学者进入文章中来感受吧!
224 2
|
8月前
|
人工智能 Java Go
golang之数组和切片
本文主要介绍了从 Java 转向 Golang 的开发者在数组和切片上的常见困惑。文章详细解析了数组和切片的底层实现、声明方式、内存结构、初始化方法以及使用场景,重点强调了数组是不可变的值类型,而切片是可变的引用类型,并通过大量代码示例讲解了它们的用法与区别。此外,还探讨了 new() 和 make() 函数的不同用途,帮助开发者更好地理解 Golang 中的数据结构机制。
116 0
|
Go
Golang语言之切片(slice)快速入门篇
这篇文章是关于Go语言中切片(slice)的快速入门教程,详细介绍了切片的概念、定义方式、遍历、扩容机制、使用注意事项以及相关练习题。
525 6
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
206 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
|
Go
【golang】golang 字符串切片排序
【golang】golang 字符串切片排序
196 1
|
监控 Serverless Go
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
154 0
|
程序员 Go
第七章 Golang数组和切片
第七章 Golang数组和切片
155 2
|
Go C++ Java
C/C++每日一练(20230408) 删除无效括号、合并K个升序链表、四数之和
C/C++每日一练(20230408) 删除无效括号、合并K个升序链表、四数之和
177 0
C/C++每日一练(20230408) 删除无效括号、合并K个升序链表、四数之和
|
Go 索引
Golang深入浅出之-切片(Slices)入门:创建、操作与扩容机制
【4月更文挑战第20天】Go语言中的切片是动态数组,提供灵活的操作和自动扩容。本文介绍了切片的创建(通过`make()`、数组创建和切片字面量)、基本操作(索引访问、切片、赋值追加和遍历)以及扩容机制(首次和后续扩容策略)。此外,还强调了切片与底层数组的关系、切片越界问题、`append()`的使用以及理解切片的关键点,帮助提升Go编程效率和代码质量。
472 0

推荐镜像

更多