Подтвердить что ты не робот

Извлечение подстрок в Go

Я пытаюсь прочитать целую строку с консоли (включая пробел), а затем обработать ее. Используя bufio.ReadString, символ новой строки считывается вместе с вводом, поэтому я придумал следующий код, чтобы обрезать символ новой строки:

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

Есть ли более идиоматический способ сделать это? То есть, существует ли уже библиотека, которая позаботится о завершении нулевого байта при извлечении подстроки для вас?

(Да, я знаю, что есть способ прочитать строку без символа новой строки в go readline → string, но я ищу больше для элегантных строковые манипуляции.)

4b9b3361

Ответ 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

Чтобы получить подстроку

  • найти позицию "sp"

  • вырезать строку с помощью массива

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])
}