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 变量
回到顶部