0

我从用户那里得到输入,但是当我稍后尝试将其与字符串文字进行比较时,它不起作用。这只是一个测试。

我想设置它,以便在输入空行时(只需按回车键)程序退出。我不明白为什么字符串不比较,因为当我打印它时,它是相同的。

in := bufio.NewReader(os.Stdin); 
input, err := in.ReadBytes('\n');

if err != nil {
    fmt.Println("Error: ", err)
}

if string(input) == "example" {
    os.Exit(0)
}
4

1 回答 1

4

字符串与 [] 字节

字符串定义:

string是所有 8 位字节字符串的集合,通常但不一定代表 UTF-8 编码的文本。字符串可以为空,但不能为零。字符串类型的值是不可变的。

字节定义:

byte 是 uint8 的别名,在所有方面都等同于 uint8。按照惯例,它用于区分字节值和 8 位无符号整数值。

这是什么意思?

  • []bytebyte一片。切片可以为空。
  • string元素是 unicode 字符,可以有超过 1 个字节。
  • string元素保持数据(编码)的含义,[]bytes而不是。
  • 相等运算符是为string类型定义的,但不是为slice类型定义的。

如您所见,它们是具有不同属性的两种不同类型。有一篇很棒的博客文章解释了不同的字符串相关类型 [1]

关于您在代码段中遇到的问题。

请记住,它会in.ReadBytes(char)返回一个char包含包含的字节切片。所以在你的代码中input以'\ n'结尾。如果您希望您的代码以所需的方式工作,请尝试以下操作:

if string(input) == "example\n" { // or "example\r\n" when on windows
    os.Exit(0)
}

还要确保您的终端代码页与您的.go源文件相同。请注意不同的结束行样式(Windows 使用“\r\n”),标准 go 编译器在内部使用 utf8。

[1]字符串处理的 Go 数据类型比较。

于 2013-09-24T02:18:17.967 回答