为什么这个布尔值没有在Go中注册?
我已经开始学习 Go,但我遇到了一个奇怪的错误,还有一个更奇怪的修复程序,用于解决HackerRack 问题:
func countingValleys(steps int32, path string) int32 {
// Write your code here
var level int32 = 0
var valleys int32 = 0
// The below declaration was throwing the initial error
insideValley := false
for _, char := range path {
fmt.Println(insideValley)
if string(char) == "U" {
if level == -1 {
insideValley = false
valleys += 1
}
level += 1
} else if string(char) == "D"{
if level == 0 {
insideValley = true
}
level -= 1
}
}
return valleys
}
编译器insideValley is declared by not used在 HR 和 Go 操场上都抱怨。我fmt.Println立即在 for 循环内部添加了调用以进行调试,怀疑它是一个范围错误,错误消失了,我的代码通过了挑战的所有测试,让我想知道:
-
为什么首先抛出错误?我目前对 Go 中变量作用域的理解是,当在这样的函数中声明时,它将对函数中包含的所有块可用。
-
为什么添加
fmt.Println那个 var 修复了错误?根据我目前的理解,我会假设如果在封闭块中的变量超出范围之前只能嵌套 X 个块,则唯一的解决方法是使用指针。
回答
所以我们在这里有一个实际上正确的答案,问题是您正在写入布尔值但从不读取它。如果没有Println(),它不会在任何依赖于其值的条件或任何其他表达式中使用,因此对它的赋值不会影响程序流程。您可以删除所有分配值的行insideValley,程序的行为将与现在没有什么不同(当然,Println() 除外,这就是添加“修复”问题的原因)。
Go 专门设计用于标记这样的“垃圾”代码,它不会向程序流程添加任何内容,作为编译器错误(好吧,在大多数情况下。未使用的全局变量和未使用的函数是一些例外)。只需添加应该使用该布尔值的任何内容(例如基于其值的条件),您将不再收到“变量未使用”错误。
而作为中的评论指出Vishwa拉特纳的答案,增值经销商也不会在每一个合乎逻辑的途径来使用。它们只需要在至少一个逻辑路径中使用(即从 读取)。