无法检查字符串。使用reader.ReadString捕获的字符串上的HasSuffix

时间:2016-10-30 00:17:26

标签: string go

概述:我使用fmt.Scanln捕获字符串,但我的一个需求是字符串必须有空格,所以我开始使用reader.ReadString,我必须检查该字符串中是否存在后缀才能生成一些字符串替换,所以我用了strings.HasSuffix。使用fmt.Scanln捕获的字符串没有问题,但现在我使用reader.ReadString它无法在字符串中找到给定的后缀。

是否有关于正在进行的事情的线索?

这是一个隔离问题的测试,在桌面安装的Go中使用它,而不是在线。

package main

import (
    "bufio"
    "fmt"
    "strings"
    "os"
    "reflect"
)
const TOKEN string = ":="

func validate(expr string) {
    fmt.Println("var type: ", reflect.TypeOf(expr))
    if strings.Contains(expr, TOKEN) {
        fmt.Println(expr, "contains works")
    } else {
        fmt.Println("error with contains")
    }

    if strings.HasSuffix(expr, TOKEN) {
        fmt.Println(expr, "suffix works")
    } else {
        fmt.Println("error with suffix")
    }
}

func main() {
    var expr2 string
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("type something finished with ':='")
    expr1, _ := reader.ReadString('\n')
    fmt.Scanln(&expr2)

    fmt.Println("validation with reader: ")
    validate(expr1)
    fmt.Println()
    fmt.Println("validation with Scanln: ")
    validate(expr2)
}

1 个答案:

答案 0 :(得分:1)

正如@Tim所提到的,reader.ReadString('\n')的输出包括'\ n'作为最后一个字符而fmt.Scanln不这样做。您可以执行const TOKEN string = ":=\n"或从字符串末尾删除'\ n'。

更新:

有些情况下,\r\n作为后缀出现,而不是通常预期的\n(Windows计算机?)

根据{{​​1}} godoc,

fmt.Scanln也会处理这种情况。

fmt