登录
首页 >  Golang >  Go问答

请指出这段Golang代码的缺陷

来源:stackoverflow

时间:2024-03-13 10:24:29 399浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《请指出这段Golang代码的缺陷》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

package main

import (
    "fmt"
    "math"
)

func main() {

    distencecalc()
}

func distencecalc() {

    fmt.Println("X1 :")
    var x1 float64
    fmt.Scanf("%f", &x1)
    fmt.Print("")
    fmt.Println("Y1 :")
    var y1 float64
    fmt.Scanf("%f", &y1)
    fmt.Print("")
    fmt.Println("Z1 :")
    var z1 float64
    fmt.Scanf("%f", &z1)
    fmt.Print("")
    fmt.Println("X2 :")
    var x2 float64
    fmt.Scanf("%f", &x2)
    fmt.Print("")
    fmt.Println("Y2 :")
    var y2 float64
    fmt.Scanf("%f", &y2)
    fmt.Print("")

    fmt.Println("Z2 :")
    var z2 float64
    fmt.Scanf("%f", &z2)
    fmt.Print("")

    var Xcalc = x2 - x1
    var Ycalc = y2 - y1
    var Zcalc = z2 - z1



    var calcX = math.Pow(Xcalc, 2)
    var calcY = math.Pow(Ycalc, 2)
    var calcZ = math.Pow(Zcalc, 2)


    var allcalc = calcX + calcZ + calcY
    fmt.Println("the result is :")
    fmt.Println(math.Sqrt(allcalc))
}

问题是我编译然后运行程序,它询问 x1 我输入值,它同时询问 y1 和 z1。


解决方案


实际上,有问题的代码可以在unix系统上运行,但通常问题是像fmt.scanf("%f", &x1)这样的调用不会消耗换行符,而是引用fmt: Scanning的包文档:

scan、fscan、sscan 将输入中的换行符视为空格。

在 windows 上,换行符不是单个 \n 字符,而是 \r\n,因此后续 fmt.scanf() 调用将立即继续,而无需等待用户的进一步输入。

因此,您必须在格式字符串中添加换行符,以避免后续的 fmt.scanf() 调用继续:

fmt.scanf("%f\n", &x1)

但更简单的方法是仅使用 fmt.Scanln() 并跳过整个格式字符串:

fmt.scanln(&x1)

scanln、fscanln 和 sscanln 在换行符处停止扫描,并要求项目后跟换行符或 eof。

扫描仪函数 (fmt.scanxxx()) 返回成功扫描的项目数和 error。要判断扫描是否成功,您必须检查其返回值,例如:

if _, err := fmt.Scanln(&x1); err != nil {
    fmt.Println("Scanning failed:", err)
}

到这里,我们也就讲完了《请指出这段Golang代码的缺陷》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>