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

5 回复

当“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)
}

你的代码存在两个问题:一是数组索引越界,二是循环逻辑导致最后一个元素无法赋值。

问题分析:

  1. 当输入10个数字时,i会从0递增到10,此时访问num[10]导致索引越界(数组长度为10,有效索引为0-9)
  2. 当输入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)
}

关键改进:

  1. 添加索引边界检查 i < len(num)
  2. 检查 fmt.Scan 的返回值,当读取失败时立即退出循环
  3. 避免在读取失败后仍然递增索引

这样处理可以:

  • 安全地读取最多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!

回到顶部