Извлечение подстрок в Go
Я пытаюсь прочитать целую строку с консоли (включая пробел), а затем обработать ее. Используя bufio.ReadString, символ новой строки считывается вместе с вводом, поэтому я придумал следующий код, чтобы обрезать символ новой строки:
input,_:=src.ReadString('\n')
inputFmt:=input[0:len(input)-2]+"" //Need to manually add end of string
Есть ли более идиоматический способ сделать это? То есть, существует ли уже библиотека, которая позаботится о завершении нулевого байта при извлечении подстроки для вас?
(Да, я знаю, что есть способ прочитать строку без символа новой строки в go readline → string, но я ищу больше для элегантных строковые манипуляции.)
Ответы
Ответ 1
Похоже, вы смущены работой срезов и форматом хранения строк, который отличается от того, что у вас есть в C.
- любой срез в Go хранит длину (в байтах), поэтому вам не нужно заботиться о стоимости операции
len
: нет необходимости считать - Строки Go не заканчиваются нулем, поэтому вам не нужно удалять нулевой байт, и вам не нужно добавлять
1
после нарезки, добавляя пустую строку.
Чтобы удалить последний символ (если это однобайтовый символ), просто выполните
inputFmt:=input[:len(input)-1]
Ответ 2
Строки Go не имеют нулевого завершения и для удаления последней char строки, которую вы можете просто сделать:
s = s[:len(s)-1]
Ответ 3
Чтобы избежать паники на входе с нулевой длиной, оберните операцию усечения в if, если
input, _ := src.ReadString('\n')
var inputFmt string
if len(input) > 0 {
inputFmt = input[:len(input)-1]
}
// Do something with inputFmt
Ответ 4
Чтобы получить подстроку
https://play.golang.org/p/0Redd_qiZM
Ответ 5
Это самая простая для выполнения подстроки в 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)
}
Ответ 6
ПРЕДУПРЕЖДЕНИЕ: работа только со строками будет работать только с ASCII и будет неверно рассчитываться, если ввод является символом, не закодированным в ASCII UTF-8, и, вероятно, будет даже повреждать символы, так как он обрезает среднечастотные последовательности многобайтовых символов.
Вот версия с поддержкой UTF-8:
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])
}