提问人:Migue 提问时间:6/2/2022 最后编辑:Migue 更新时间:6/2/2022 访问量:4435
Golang 中“n”个切片值的总和
Sum of "n" Slices values in Golang
问:
我正在尝试使用 Slices 和 For Loops 在 golang 中制作一个简单的平均计算器。
但是我在 VS 代码中遇到了一个错误,这个:
恐慌:运行时错误:索引超出范围 [0],长度为 0 goroutine 1 [正在运行]: main.main() 中 C:/桌面/cs50/week2/myarray.go:16 +0x134 退出状态 2
我在 W10 上使用 VS 代码。
我的代码:
package main
import "fmt"
func main() {
var n int
scores := []uint{}
var sumScores float32 = 0
fmt.Println("How many scores?") //ask user how many values
fmt.Scan(&n) //get how many values
for i := 0; i < n; i++ {
fmt.Printf("Scores: ") // ask for values
fmt.Scan(&scores[i]) // get values
sumScores = sumScores + float32(scores[i]) // sum values
}
fmt.Printf("Average: %f\n", sumScores/float32(n)) //average value
}
知道可能出了什么问题吗?
我认为这可能与我使用 float32 的 Slice 定义有关。
提前谢谢你。
答:
2赞
no0ob
6/2/2022
#1
这非常有效,您只需要指出切片的初始大小:
func main() {
var n int
var sumScores float32 = 0
fmt.Println("How many scores?") //ask user how many values
fmt.Scan(&n) //get how many values
scores := make([]uint, n, n)
for i := 0; i < n; i++ {
fmt.Printf("Scores: ") // ask for values
fmt.Scan(&scores[i]) // get values
sumScores = sumScores + float32(scores[i]) // sum values
}
fmt.Printf("Average: %f\n", sumScores/float32(n)) //average value
}
用于学习目的
您声明切片的方式,它只是一个空切片,因此您可以先附加到它,然后在新生成的位置扫描数字。(但这肯定不是解决这个特定问题的方法)scores
func main() {
var n int
scores := []uint{}
var sumScores float32 = 0
fmt.Println("How many scores?") //ask user how many values
fmt.Scan(&n) //get how many values
for i := 0; i < n; i++ {
fmt.Printf("Scores: ") // ask for values
scores = append(scores, 0)
fmt.Scan(&scores[i]) // get values
sumScores = sumScores + float32(scores[i]) // sum values
}
fmt.Printf("Average: %f\n", sumScores/float32(n)) //average value
}
0赞
guo-sj
6/2/2022
#2
分数 := []uint{}
这是一个切片文字,您应该使用 Golang 内置函数。append
就像@no0ob的第二个例子一样,或者这样:
func main() {
var n int
var tmpVal uint
scores := []uint{}
var sumScores float32 = 0
fmt.Println("How many scores?") //ask user how many values
fmt.Scan(&n) //get how many values
for i := 0; i < n; i++ {
fmt.Printf("Scores: ") // ask for values
fmt.Scan(&tmpVal) // save input to tmpVal
scores = append(scores, tmpVal) // append tmpVal to scores
sumScores = sumScores + float32(scores[i]) // sum values
}
fmt.Printf("Average: %f\n", sumScores/float32(n)) //average value
}
评论
0赞
Migue
6/2/2022
谢谢!是的,我是编码新手。所以我正在做一些练习来学习如何正确使用基本功能。谢谢!
评论
scores
切片的长度为 0。你实际上并没有使用那个切片。您可以简单地扫描到一个 int,然后继续将其添加到 sumScores。scores = make([]uint, n)