Golang数组填充问题:最后一个元素无法赋值怎么办
Golang数组填充问题:最后一个元素无法赋值怎么办 大家好! 我是Go语言的新手。 在尝试像下面这样填充数组时,我遇到了一个奇怪的现象:
package main
import "fmt"
func main() {
var i int
var err error
var num[10] int
err = nil
for err == nil {
_, err = fmt.Scan(&num[i])
i++
}
fmt.Println(num)
}
于是,我在标准输入中传入9个数字:1 2 3 4 5 6 7 8 9,然后得到了数组:
[1 2 3 4 5 6 7 8 9 0]
看起来没问题,但我的最后一个值仍然是0。 当我尝试传入十个数字 1 2 3 4 5 6 7 8 9 10 时,我得到了:
panic: runtime error: index out of range
goroutine 1 [running]:
main.main()
/sandbox/main.go:9 +0x177
请问有谁能告诉我,为什么我无法处理最后一个值 num[9]?
更多关于Golang数组填充问题:最后一个元素无法赋值怎么办的实战教程也可以访问 https://www.itying.com/category-94-b0.html
当“i”达到9时,你可以输入第10个元素,然后“i”递增并得到值10。接着你尝试读取num[10],程序会因数组索引范围为0到9而引发恐慌。
请尝试以下代码
var tenp
_, err = fmt.Scan(&temp)
num[i] = temp
i++
现在,程序会在行num[i] = temp处引发恐慌,因为i超出了数组的界限。
更多关于Golang数组填充问题:最后一个元素无法赋值怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
感谢您的回复。
我看到您的代码可以正常工作。但我不明白为什么我的代码只能从标准输入读取数组长度减1个值?为什么最后一个 num[9] 不能以那种方式填充?实际上索引是从 0 到 9,所以是 10 个值!但我只能输入 9 个!
您可以亲自验证一下。
如果我仅输入一个或九个数字,它工作正常!但是,如果我尝试填满整个数组,就会出错。
我只是想弄明白原因。
感谢您的建议!
你陷入了一个无限循环,并且没有进行边界检查。当你声明一个长度为10的数组时,索引范围是从0到9。因此,将你的代码修改为:
for err == nil {
if i == 10 {
break
}
fmt.Printf("element[%d=", i)
_, err = fmt.Scan(&num[i])
i++
}
或者更好的写法是:
func main() {
var num [10]int
for i := 0; i < 10; i++ {
fmt.Printf("element[%d]=", i)
fmt.Scan(&num[i])
}
fmt.Println(num)
}
你的代码存在两个问题:一是数组索引越界,二是循环逻辑导致最后一个元素无法赋值。
问题分析:
- 当输入10个数字时,
i会从0递增到10,此时访问num[10]导致索引越界(数组长度为10,有效索引为0-9) - 当输入9个数字时,
fmt.Scan在第10次读取时会失败(没有更多输入),err变为非nil,循环结束,但此时num[9]从未被赋值,保持零值0
解决方案: 需要同时控制索引范围和处理扫描错误。以下是修正后的代码:
package main
import (
"fmt"
)
func main() {
var num [10]int
var i int
// 限制最多读取10个数字
for i < len(num) {
n, err := fmt.Scan(&num[i])
if err != nil || n == 0 {
break
}
i++
}
fmt.Println(num)
}
或者使用更简洁的写法:
package main
import "fmt"
func main() {
var num [10]int
for i := 0; i < len(num); i++ {
if n, err := fmt.Scan(&num[i]); err != nil || n == 0 {
break
}
}
fmt.Println(num)
}
关键改进:
- 添加索引边界检查
i < len(num) - 检查
fmt.Scan的返回值,当读取失败时立即退出循环 - 避免在读取失败后仍然递增索引
这样处理可以:
- 安全地读取最多10个数字
- 正确处理输入不足10个的情况
- 避免数组索引越界错误
感谢您的帮助!现在我明白了:
package main
import "fmt"
func main() {
var i int
var err error
var num[10] int
err = nil
for err == nil {
_, err = fmt.Scan(&num[i])
fmt.Println("now i=",i)
fmt.Println("now element of i=", num[i])
fmt.Println("and error now is: ",err)
fmt.Println("")
i++
}
fmt.Println(num)
}
结果:
now i= 0 now element of i= 1 and error now is:
now i= 1 now element of i= 2 and error now is:
now i= 2 now element of i= 3 and error now is:
now i= 3 now element of i= 4 and error now is:
now i= 4 now element of i= 5 and error now is:
now i= 5 now element of i= 6 and error now is:
now i= 6 now element of i= 7 and error now is:
now i= 7 now element of i= 8 and error now is:
now i= 8 now element of i= 9 and error now is:
now i= 9 now element of i= 0 and error now is: EOF
[1 2 3 4 5 6 7 8 9 0]
所以,当我遇到 EOF 时,i=9 并且最后一个元素获取了值 0。这就是为什么当我向标准输入输入 10 个数字时,程序试图访问索引 10,而不是索引 9!

