函数返回一个空数组,即使传递了 int 参数
来源:stackoverflow
时间:2024-02-29 22:03:26 173浏览 收藏
一分耕耘,一分收获!既然都打开这篇《函数返回一个空数组,即使传递了 int 参数》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!
我将一个字符串数组和一个空整数数组传递到一个函数中。该函数的要点是将字符串数组的每个元素转换为整数并将其存储到整数数组中。当我从函数本身内部打印整数数组时,一切都很好。但是,当我尝试在函数外部打印整数数组时,它会打印一个空数组。
employeedataint
为整型数组,employeedatastring
为字符串数组。
如果这是一个愚蠢的问题,我深表歉意,但我是新手。谢谢
package main import ( "bufio" "fmt" "log" "os" "strconv" "strings" ) func strToInt(employeeDataString []string, emplyoeeDataInt []int) []int { for _, i := range employeeDataString[2:] { j, err := strconv.Atoi(i) if err != nil { panic(err) } employeeDataInt = append(employeeDataInt, j) fmt.Println(employeeDataInt) //this prints out the appropriate array } return employeeDataInt } func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Enter file name: ") fileName, err := reader.ReadString('\n') if err != nil { log.Fatalf("failed opening file: %s", err) } fileName = strings.TrimSuffix(fileName, "\n") file, err := os.Open(fileName) scanner := bufio.NewScanner(file) scanner.Split(bufio.ScanLines) var employeeLine []string for scanner.Scan() { employeeLine = append(employeeLine, scanner.Text()) } file.Close() var employeeDataString = []int{} for _, employee := range employeeLine { employeeDataString := strings.Split(employee, " ") strToInt(employeeDataString, employeeDataInt) fmt.Println(playerData2) //this is outputting just `[]` } }
解决方案
您没有获取数组的值,因此您传递到函数中的切片可能会或可能不会正确更新。
strtoint(employeedatastring, employeedataint) // should be employeedataint = strtoint(employeedatastring, employeedataint)
在执行此操作时,您永远不会分配 playerdata2
。所以 fmt.println(playerdata2)
将始终是 []
。
但除此之外,您在此处使用数组/切片还存在一些微妙的问题:
首先是Slices
and Arrays
之间的区别:
go 不允许您直接使用数组。
除非它们具有固定长度([3]int{}
或 []int{1,2,3]
),否则您实际上并不是在查看数组,而是在查看 slice
([]int
)。
切片只是一个指向数组的指针(连同它的容量和一些其他信息),它本质上允许 go 安全地处理数组,因为你永远不会增长现有数组(数组的大小在初始化时是固定的) )。所以你永远不能追加到数组中。
go 的做法是让你产生附加到数组的错觉,即拥有一个比所需的基础数组更大的数组,并且 slice
控制对该数组的访问。因此,如果基础数组的容量为 5 并且您已在其中存储了 3 个项目,则可以执行 2 个 append
操作,而无需分配新数组并将现有数组元素复制到新的内存位置。
因此,当您传递 []int
时,您实际上是在传递一个数组指针(按值)。
这会导致代码中的下一个问题:使用 append
。
如上所述,append
接受一个 slice,查看底层数组以及实际剩余的空间,然后添加到它或分配一个新数组。如果分配了新数组,append
将返回一个指向新数组的新切片。
调用:
foo := []{1,2,3} append(foo, 4) append(foo, 5) append(foo, 6) fmt.Print(foo) // => might return 1,2,3,4,5
您始终必须获取 append
的返回值,否则您仍有可能引用未附加新项目的“旧”切片。
因此,增长切片或一般使用切片的正确方法是记住:Slices are passed by value,因此始终使用切片修改函数的返回值更新变量。
本篇关于《函数返回一个空数组,即使传递了 int 参数》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!
-
502 收藏
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
139 收藏
-
204 收藏
-
325 收藏
-
478 收藏
-
486 收藏
-
439 收藏
-
357 收藏
-
352 收藏
-
101 收藏
-
440 收藏
-
212 收藏
-
143 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习