Golang 中“n”个切片值的总和

Sum of "n" Slices values in Golang

提问人:Migue 提问时间:6/2/2022 最后编辑:Migue 更新时间:6/2/2022 访问量:4435

问:

我正在尝试使用 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 定义有关。

提前谢谢你。

for-loop go 切片

评论

1赞 Burak Serdar 6/2/2022
scores切片的长度为 0。你实际上并没有使用那个切片。您可以简单地扫描到一个 int,然后继续将其添加到 sumScores。
1赞 Rahmat Fathoni 6/2/2022
scores = make([]uint, n)
0赞 Gardener 6/2/2022
您已将分数声明为 int 数组。因此,sumScores 也将始终为 n int。你只会得到一个浮点数作为除法的结果。
0赞 Migue 6/2/2022
@RahmatFathoni谢谢。现在我知道我需要以这种方式声明变量。谢谢。

答:

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
谢谢!是的,我是编码新手。所以我正在做一些练习来学习如何正确使用基本功能。谢谢!