Golang新手变量声明问题解决方法
Golang新手变量声明问题解决方法 在学习代码教程的过程中,我在平方根示例处卡住了——无法理解为什么函数返回的"z"值是0。为什么它与循环内计算的z值不同?
谢谢!
以下是代码:
package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
var z float64
var i int
for z:=1.0; i<=10 && z*z!=x ; i++ {
z -= (z*z - x) / (2*z)
fmt.Println(x, z)
}
fmt.Println("result=")
return z
}
func main() {
fmt.Println(Sqrt(4))
}
更多关于Golang新手变量声明问题解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
谢谢!我会想办法把代码格式化的。
关于我的问题——谢谢——我之前没有理解赋值格式之间的区别,现在似乎清楚了……
再次感谢。
更多关于Golang新手变量声明问题解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
未来能否请您使用围栏式或缩进式代码块来正确标记您的代码?
除此之外,首先您声明了 var z float64,它会初始化为 0.0,因为这是浮点数的零值。
然后在循环中您使用了 z := 1.0,这会创建一个新的变量 z,其作用域仅限于循环内部。外部的 z 在此变量超出作用域之前不会被改变。
由于您从未重新赋值外部的 z,它始终保持为 0。
在循环中初始化 z 时,您应该使用 = 而不是 :=。
func main() {
var z float64
for i := 0; i < 10; i++ {
z = 1.0
// 其他代码
}
}
问题在于变量作用域和声明方式。在循环中使用了短变量声明 z:=1.0,这创建了一个新的局部变量 z,而不是使用函数开头声明的 z。
以下是修复后的代码:
package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
z := 1.0 // 使用短变量声明初始化z
for i := 0; i <= 10 && z*z != x; i++ {
z -= (z*z - x) / (2*z)
fmt.Println("迭代", i, ":", x, z)
}
fmt.Println("最终结果:")
return z
}
func main() {
fmt.Println(Sqrt(4))
}
或者保持原有的变量声明方式:
func Sqrt(x float64) float64 {
var z float64 = 1.0 // 初始化z为1.0
var i int
for i = 0; i <= 10 && z*z != x; i++ {
z -= (z*z - x) / (2*z)
fmt.Println("迭代", i, ":", x, z)
}
fmt.Println("最终结果:")
return z
}
关键问题:
- 循环中的
z:=1.0创建了新的局部变量,循环结束后这个局部变量就消失了 - 函数返回的是外层声明的
var z float64,其默认值为0 - 需要确保使用的是同一个
z变量

