账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    GoLang控制台Stdin传参问题
    • 2019-12-18 00:00
    • 11
    46
    0

    问题描述

    如题,控制台传值时,通过go run直接运行的时候可以完全获取到传入的命令行参数值,但是通过go build构建成应用之后每行仅能传入1024个字符,多出的部分会被截取掉

    问题出现的环境背景及自己尝试过哪些方法

    尝试过更改接收方式,NewScanner(),NewReader(), NewReaderSize()均用了无果,且百度谷歌无相关解决方案

    相关代码

    fmt.Println("请输入你的cookie信息:")
    reader := bufio.NewReaderSize(os.Stdin, 4 * 1024)
    for {
        cookieValue, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("参数传入错误,请重试:", err)
        }
        if cookieValue == "\n" {
            log.Println("参数不能为空")
        } else {
            fmt.Println(cookieValue)
            break
        }
    }

    你期待的结果是什么?实际看到的错误信息又是什么?

    求排查原因,使stdin输入参数时可突破单行1024字符的限制

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 共 0 条
    • 脑震荡失忆 普通会员 1楼

      在Go语言中,控制台输入(stdin)主要用于接收用户的输入。然而,如果你在控制台传参,可能会遇到一些问题。下面是一些可能遇到的问题和解决方法:

      1. 未定义的变量:如果你在控制台传参时,传入了一个未定义的变量,那么这个变量在运行时是未定义的。你可以使用nil来代替,表示参数是空的。例如:

      go var x int fmt.Scanln(&x)

      1. 类型转换错误:如果你在控制台传参时,传入的参数类型和预期的参数类型不匹配,那么在运行时可能会发生类型转换错误。你可以使用type assertion来确保参数类型匹配。例如:

      go var x int fmt.Scanln(&x) if x != 5 { fmt.Println("Error: x must be 5") return }

      1. 输入流错误:如果你在控制台传参时,传入的参数是一个输入流,但是这个输入流没有在程序运行时被关闭,那么在运行时可能会出现缓冲区溢出或缓冲区错误。你可以使用close函数来关闭输入流。例如:

      go var x int io.Copy(&x, os.Stdin)

      1. 错误的输入格式:如果你在控制台传参时,传入的参数是一个非空字符串,但是这个字符串格式不符合程序的预期,那么在运行时可能会出现错误。你可以使用fmt.Sprintf函数来格式化字符串。例如:

      go var x string fmt.Scanln(&x) fmt.Println("%s", x)

      1. 压缩输出:如果你在控制台传参时,使用了fmt.Println或fmt.PrintlnW等函数进行输出,但是这些函数不会压缩输出,而是直接打印到控制台。你可以使用strings.Repeat函数来实现输出的压缩。例如:

      go var x int fmt.Println(strings.Repeat("a", x))

      总的来说,你需要确保传入的参数是合法的,并且在运行时能够正确地进行类型转换和输出。

    • 队友最浪 普通会员 2楼

      在Go语言中,控制台输入(stdin)主要用于接收用户的输入。然而,如果你在控制台传参,可能会遇到一些问题。下面是一些可能遇到的问题和解决方法:

      1. 未定义的变量:如果你在控制台传参时,传入了一个未定义的变量,那么这个变量在运行时是未定义的。你可以使用nil来代替,表示参数是空的。例如:

      go var x int fmt.Scanln(&x)

      1. 类型转换错误:如果你在控制台传参时,传入的参数类型和预期的参数类型不匹配,那么在运行时可能会发生类型转换错误。你可以使用type assertion来确保参数类型匹配。例如:

      go var x int fmt.Scanln(&x) if x != 5 { fmt.Println("Error: x must be 5") return }

      1. 输入流错误:如果你在控制台传参时,传入的参数是一个输入流,但是这个输入流没有在程序运行时被关闭,那么在运行时可能会出现缓冲区溢出或缓冲区错误。你可以使用close函数来关闭输入流。例如:

      go var x int io.Copy(&x, os.Stdin)

      1. 错误的输入格式:如果你在控制台传参时,传入的参数是一个非空字符串,但是这个字符串格式不符合程序的预期,那么在运行时可能会出现错误。你可以使用fmt.Sprintf函数来格式化字符串。例如:

      go var x string fmt.Scanln(&x) fmt.Println("%s", x)

      1. 压缩输出:如果你在控制台传参时,使用了fmt.Println或fmt.PrintlnW等函数进行输出,但是这些函数不会压缩输出,而是直接打印到控制台。你可以使用strings.Repeat函数来实现输出的压缩。例如:

      go var x int fmt.Println(strings.Repeat("a", x))

      总的来说,你需要确保传入的参数是合法的,并且在运行时能够正确地进行类型转换和输出。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部