提取 Go 中的子字符串

我试图从控制台(包括空格)读取整行代码,然后处理它。用水牛。ReadString,新行字符与输入一起读取,所以我想出了以下代码来修剪新行字符:

input,_:=src.ReadString('\n')
inputFmt:=input[0:len(input)-2]+"" //Need to manually add end of string

还有比这更惯用的方法吗?也就是说,在为您提取子字符串时,是否已经有一个处理结束空字节的库?

(是的,我知道已经有一种方法可以读取 转到 readline-> string中没有换行符的行,但是我正在寻找优雅的字符串操作。)

294283 次浏览

看起来您似乎对片的工作和字符串存储格式感到困惑,这与 C 语言中的格式不同。

  • Go 中的任何片都存储长度(以字节为单位) ,因此您不必关心 len操作的成本: 不需要计数
  • Go 字符串不以 null 结束,因此不必删除 null 字节,也不必在切片后添加空字符串来添加 1

要删除最后一个字符(如果是一个字节的字符) ,只需执行以下操作

inputFmt:=input[:len(input)-1]

Go 字符串不以 null 结束,要删除字符串的最后一个字符,只需要:

s = s[:len(s)-1]

若要避免对零长度输入产生恐慌,请将截断操作包装在 if 中

input, _ := src.ReadString('\n')
var inputFmt string
if len(input) > 0 {
inputFmt = input[:len(input)-1]
}
// Do something with inputFmt

获取子字符串

  1. 找到“ SP”的位置

  2. 数组逻辑割字符串

Https://play.golang.org/p/0redd_qizm

这是在 Go 中执行子字符串的简单方法

package main


import "fmt"


var p = fmt.Println


func main() {


value := "address;bar"


// Take substring from index 2 to length of string
substring := value[2:len(value)]
p(substring)


}

警告: 只对字符串进行操作只能使用 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])
}

8年后,我偶然发现了这颗宝石,但我不相信 OP 最初的问题真的得到了回答:

所以我想出了以下代码来修剪换行符

虽然 bufio.Reader类型支持 ReadLine()方法,它同时去除了 \r\n\n,但它是一个低级函数,使用起来很麻烦,因为重复检查是必要的。

IMO 移除空白的一个惯用方法是使用 Golang 的 绳子库:

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 的操场上看到这个例子:

希望这个功能对某些人有所帮助,

str := "Error 1062: Duplicate entry 'user@email.com' 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 ""
}
}