gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:50:32 24 4
gpt4 key购买 nike

概述:我使用 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)
}

最佳答案

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

更新:

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

fmt.Scanln 也可以根据 fmt godoc 处理这种情况。

在所有扫描函数中,回车后紧跟换行符将被视为普通换行符(\r\n 与\n 含义相同)。

关于string - 无法检查使用 reader.ReadString 捕获的字符串上的 strings.HasSuffix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40324940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com