为了账号安全,请及时绑定邮箱和手机立即绑定

如何比较 GoLang 中的字符串?

如何比较 GoLang 中的字符串?

Go
千巷猫影 2021-11-29 16:47:29
在 Go 字符串比较方面,我无法产生“真实”结果。我写了以下内容来解释问题并附上输出的屏幕截图// string comparison in Gopackage mainimport "fmt"import "bufio"import "os"func main() {    var isLetterA bool     fmt.Println("Enter the letter a")    reader := bufio.NewReader(os.Stdin)    input, _ := reader.ReadString('\n')    if(input == "a") {        isLetterA = true    } else {        isLetterA = false     }    fmt.Println("You entered",input)    fmt.Println("Is it the letter a?",isLetterA)}
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

==是在 Go 中比较字符串的正确运算符。但是,您从 STDIN 读取的字符串reader.ReadString不包含"a", 但是"a\n"(如果仔细观察,您会在示例输出中看到额外的换行符)。

您可以使用该strings.TrimRight函数从输入中删除尾随空格:

if strings.TrimRight(input, "\n") == "a" {
    // ...
    }


查看完整回答
反对 回复 2021-11-29
?
波斯汪

TA贡献1811条经验 获得超4个赞

对于平台独立用户或 Windows 用户,您可以做的是:


导入运行时:


import (

    "runtime"

    "strings"

)

然后像这样修剪字符串:


if runtime.GOOS == "windows" {

  input = strings.TrimRight(input, "\r\n")

} else {

  input = strings.TrimRight(input, "\n")

}

现在你可以这样比较:


if strings.Compare(input, "a") == 0 {

  //....yourCode

}

当您在多个平台上使用 STDIN 时,这是一种更好的方法。


解释

发生这种情况是因为在 windows 上的行"\r\n"以 CRLF 结尾,但在 UNIX 行中"\n"以 LF结尾,这就是为什么我们"\n"在基于 Unix 的操作系统上修剪而"\r\n"在 windows 上修剪的原因。


查看完整回答
反对 回复 2021-11-29
?
HUH函数

TA贡献1836条经验 获得超4个赞

假设没有前置/后继空格字符,仍然有几种方法可以断言字符串相等。其中一些是:

以下是一些基本的基准测试结果(在这些测试中,strings.EqualFold(.., ..)似乎是性能最好的选择):

goos: darwin

goarch: amd64

BenchmarkStringOps/both_strings_equal::equality_op-4               10000        182944 ns/op

BenchmarkStringOps/both_strings_equal::strings_equal_fold-4        10000        114371 ns/op

BenchmarkStringOps/both_strings_equal::fold_caser-4                10000       2599013 ns/op

BenchmarkStringOps/both_strings_equal::lower_caser-4               10000       3592486 ns/op


BenchmarkStringOps/one_string_in_caps::equality_op-4               10000        417780 ns/op

BenchmarkStringOps/one_string_in_caps::strings_equal_fold-4        10000        153509 ns/op

BenchmarkStringOps/one_string_in_caps::fold_caser-4                10000       3039782 ns/op

BenchmarkStringOps/one_string_in_caps::lower_caser-4               10000       3861189 ns/op


BenchmarkStringOps/weird_casing_situation::equality_op-4           10000        619104 ns/op

BenchmarkStringOps/weird_casing_situation::strings_equal_fold-4    10000        148489 ns/op

BenchmarkStringOps/weird_casing_situation::fold_caser-4            10000       3603943 ns/op

BenchmarkStringOps/weird_casing_situation::lower_caser-4           10000       3637832 ns/op

由于有很多选项,所以这里是生成基准的代码。


package main


import (

    "fmt"

    "strings"

    "testing"


    "golang.org/x/text/cases"

    "golang.org/x/text/language"

)


func BenchmarkStringOps(b *testing.B) {

    foldCaser := cases.Fold()

    lowerCaser := cases.Lower(language.English)


    tests := []struct{

        description string

        first, second string

    }{

        {

            description: "both strings equal",

            first: "aaaa",

            second: "aaaa",

        },

        {

            description: "one string in caps",

            first: "aaaa",

            second: "AAAA",

        },

        {

            description: "weird casing situation",

            first: "aAaA",

            second: "AaAa",

        },

    }


    for _, tt := range tests {

        b.Run(fmt.Sprintf("%s::equality op", tt.description), func(b *testing.B) {

            for i := 0; i < b.N; i++ {

                benchmarkStringEqualsOperation(tt.first, tt.second, b)

            }

        })


        b.Run(fmt.Sprintf("%s::strings equal fold", tt.description), func(b *testing.B) {

            for i := 0; i < b.N; i++ {

                benchmarkStringsEqualFold(tt.first, tt.second, b)

            }

        })


        b.Run(fmt.Sprintf("%s::fold caser", tt.description), func(b *testing.B) {

            for i := 0; i < b.N; i++ {

                benchmarkStringsFoldCaser(tt.first, tt.second, foldCaser, b)

            }

        })


        b.Run(fmt.Sprintf("%s::lower caser", tt.description), func(b *testing.B) {

            for i := 0; i < b.N; i++ {

                benchmarkStringsLowerCaser(tt.first, tt.second, lowerCaser, b)

            }

        })

    }

}


func benchmarkStringEqualsOperation(first, second string, b *testing.B) {

    for n := 0; n < b.N; n++ {

        _ = strings.ToLower(first) == strings.ToLower(second)

    }

}


func benchmarkStringsEqualFold(first, second string, b *testing.B) {

    for n := 0; n < b.N; n++ {

        _ = strings.EqualFold(first, second)

    }

}


func benchmarkStringsFoldCaser(first, second string, caser cases.Caser, b *testing.B) {

    for n := 0; n < b.N; n++ {

        _ = caser.String(first) == caser.String(second)

    }

}


func benchmarkStringsLowerCaser(first, second string, caser cases.Caser, b *testing.B) {

    for n := 0; n < b.N; n++ {

        _ = caser.String(first) == caser.String(second)

    }

}



查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信