arrays - Golang-无效的数组绑定(bind)

标签 arrays go

当我运行下面的代码时出现错误:

school_mark.go:8: invalid array bound s

我的代码:

package main

import "fmt"

func main(){
   var subj float64
   fmt.Println("Enter how much you have subjects inn school: ")
   fmt.Scanf("%f", &subj)
   s := subj
   var mark [s]float64
   var a float64
   for a = 0; a<s; a++{
     fmt.Scanf("%f", &mark)
   }
   var total float64
   var i float64
   for i= 0; i<subj; i++{
       total += mark[i]
   }
       fmt.Println(total/subj)    
}

问题是什么?

最佳答案

Spec: Array types:

The length is part of the array's type; it must evaluate to a non-negative constant representable by a value of type int.

[s]float64 中的长度不是常量。

使用 slice而不是数组类型,并且知道您必须使用整数类型作为长度,例如:

var mark []float64 = make([]float64, int(s))

或简称:

mark := make([]float64, int(s))

展望 future ,索引始终使用整数类型(例如 int)。您可以在 for 中声明它,例如:

for i := 0; i < len(mark); i++ {
    fmt.Scanf("%f", &mark[i])
}

或者您甚至可以使用 for ... range 来遍历 slice 的索引:

for i := range mark {
    fmt.Scanf("%f", &mark[i])
}

我也会在任何地方使用 int 类型:如果主题和标记的数量不是整数,它们本身就没有意义。

此外,fmt.Scanf() 不会消耗换行符,后续的 fmt.Scanf() 调用将立即返回错误。

您还应该检查错误或成功解析的值,这两者均由 fmt.Scan*() 函数返回。

此外,您不必将 slice 循环两次,您可以在第一个中计算总数(总和)。

更进一步,您甚至不必将标记存储在 slice 中,您只需询问输入的标记数,即时计算总和并打印平均值。

像这样:

var n, total, mark int
fmt.Println("Number of subjects:")
fmt.Scanln(&n)
for i := 0; i < n; i++ {
    fmt.Scanln(&mark)
    total += mark
}
fmt.Println("Average:", float64(total)/float64(n))

如果您要添加所有必需的检查,它可能看起来像这样:

var n, total, mark int
fmt.Print("Number of subjects: ")
if _, err := fmt.Scanln(&n); err != nil || n <= 0 {
    fmt.Println("Wrong number!")
    return
}
for i := 0; i < n; i++ {
    fmt.Printf("Enter %d. mark: ", i+1)
    if _, err := fmt.Scanln(&mark); err != nil || mark < 1 || mark > 5 {
        fmt.Println("Wrong mark, enter it again!")
        fmt.Scanln()
        i-- // We're gonna re-scan the same mark
    } else {
        total += mark
    }
}
fmt.Println("Average:", float64(total)/float64(n))

关于arrays - Golang-无效的数组绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35031502/

相关文章:

java - 如何将 int 数字更改为等效的 asci 数字?

docker 安装 lvm 插件

json - 结构中的 json 标记真的需要编码吗?

file - FSNotify 在运行时添加监视目录

ios - 如何在 Swift 中正确声明自定义对象数组?

javascript - 基于用户选择的数组与 Raphael、jQuery/JavaScript 的交集

go - Go 编译错误 : cannot use new(SimpleChaincode)

go - 何时使用 os.Exit() 和 panic()?

jquery - 如何在jquery中创建和访问数组

c++ - C++ 中有 "generics-like"功能吗?