153

我正在尝试从控制台读取整行(包括空格),然后对其进行处理。使用 bufio.ReadString,换行符与输入一起读取,所以我想出了以下代码来修剪换行符:

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

有没有更惯用的方法来做到这一点?也就是说,在为您提取子字符串时,是否已经有一个库可以处理结束的空字节?

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

4

8 回答 8

195

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

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

要删除最后一个字符(如果它是一个字节字符),只需执行

inputFmt:=input[:len(input)-1]
于 2012-09-07T07:39:37.790 回答
58

警告:仅对字符串进行操作仅适用于 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])
}
于 2019-05-14T11:27:26.153 回答
29

Go 字符串不是以 null 结尾的,要删除字符串的最后一个字符,您可以简单地执行以下操作:

s = s[:len(s)-1]
于 2012-09-07T15:10:53.790 回答
12

这是在 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)

}
于 2018-05-23T07:37:42.807 回答
11

为避免零长度输入出现恐慌,请将截断操作包装在 if

input, _ := src.ReadString('\n')
var inputFmt string
if len(input) > 0 {
    inputFmt = input[:len(input)-1]
}
// Do something with inputFmt
于 2015-02-05T18:37:53.987 回答
3

获取子字符串

  1. 找到“sp”的位置

  2. 用数组逻辑切割字符串

https://play.golang.org/p/0Redd_qiZM

于 2015-11-03T08:51:43.867 回答
2

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 游乐场中查看此示例:https: //play.golang.org/p/HrOWH0kl3Ww

于 2020-01-30T08:37:33.903 回答
1

希望此功能对某人有所帮助,

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 ""
    }
}
于 2021-09-07T05:52:23.997 回答