我试图从控制台读取整行(包括空格),然后处理它。使用 bufio.ReadString,换行符与输入一起读取,因此我想出了以下代码来修剪换行符:
input,_:=src.ReadString('\n')
inputFmt:=input[0:len(input)-2]+"" //Need to manually add end of string
有更惯用的方法吗?也就是说,是否已经有一个库可以在为您提取子字符串时处理结束空字节?
(是的,我知道已经有一种方法可以在 go readline -> string 中读取没有换行符的行,但我正在寻找更多优雅的字符串操作。)
看起来您对切片的工作和字符串存储格式感到困惑,这与 C 中的不同。
len
操作的成本:无需计数1
。要删除最后一个字符(如果它是单字节字符),只需执行
inputFmt:=input[:len(input)-1]
警告:单独对字符串进行操作只能使用 ASCII,并且当输入是非 ASCII UTF-8 编码字符时计数会错误,甚至可能会损坏字符,因为它会在序列中剪切多字节字符。
这是支持 UTF-8 的版本:
// NOTE: this isn't multi-Unicode-codepoint aware, like specifying skintone or
// gender of an emoji: https://unicode.org/emoji/charts/full-emoji-modifiers.html
func substr(input string, start int, length int) string {
asRunes := []rune(input)
if start >= len(asRunes) {
return ""
}
if start+length > len(asRunes) {
length = len(asRunes) - start
}
return string(asRunes[start : start+length])
}
Go 字符串不是以 null 结尾的,要删除字符串的最后一个字符,您可以简单地执行以下操作:
s = s[:len(s)-1]
这是在 Go 中执行子字符串的简单方法
package main
import "fmt"
func main() {
value := "address;bar"
// Take substring from index 2 to length of string
substring := value[2:len(value)]
fmt.Println(substring)
}
为了避免零长度输入出现恐慌,请将截断操作包装在 if 中
input, _ := src.ReadString('\n')
var inputFmt string
if len(input) > 0 {
inputFmt = input[:len(input)-1]
}
// Do something with inputFmt
8年后,我偶然发现了这颗宝石,但我不相信OP最初的问题得到了真正的回答:
所以我想出了以下代码来修剪换行符
虽然
bufio.Reader
类型支持 ReadLine()
方法,该方法同时删除 \r\n
和 \n
,但它是一个低级函数,使用起来很尴尬,因为需要重复检查。
IMO 删除空格的惯用方法是使用 Golang 的 strings 库:
input, _ = src.ReadString('\n')
// more specific to the problem of trailing newlines
actual = strings.TrimRight(input, "\r\n")
// or if you don't mind to trim leading and trailing whitespaces
actual := strings.TrimSpace(input)
查看 Golang Playground 中的实际示例:https://play.golang.org/p/HrOWH0kl3Ww
希望这个功能对某人有帮助,
str := "Error 1062: Duplicate entry '[email protected]' for key 'users.email'"
getViolatedValue(str)
这用于主字符串中使用 ' 的子字符串
func getViolatedValue(msg string) string {
i := strings.Index(msg, "'")
if i > -1 {
part := msg[i+1:]
j := strings.Index(part, "'")
if j > -1 {
return part[:j]
}
return ""
} else {
return ""
}
}
不太难:
str := "😄♥️👍"
substr := string([]rune(str)[1:2])
print(substr) // outputs ♥️