[go] Go에서 부분 문자열 추출

콘솔에서 전체 줄 (공백 포함)을 읽은 다음 처리하려고합니다. bufio.ReadString을 사용하면 개행 문자가 입력과 함께 읽혀 지므로 개행 문자를 자르기 위해 다음 코드를 작성했습니다.

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

이것을 수행하는 더 관용적 인 방법이 있습니까? 즉, 하위 문자열을 추출 할 때 끝 널 바이트를 처리하는 라이브러리가 이미 있습니까?

(예, go readline-> string 에서 개행 문자없이 행을 읽는 방법이 이미 있다는 것을 알고 있지만 우아한 문자열 조작을 더 찾고 있습니다.)



답변

C에서 사용하는 것과는 다른 슬라이스 작업과 문자열 저장 형식으로 인해 혼란스러워 보입니다.

  • Go의 모든 슬라이스는 길이 (바이트)를 저장하므로 len작업 비용에 대해 신경 쓸 필요가 없습니다. 계산할 필요가 없습니다.
  • Go 문자열은 null로 끝나지 않으므로 null 바이트를 제거 할 필요가 없으며 1빈 문자열을 추가하여 슬라이싱 후 추가 할 필요가 없습니다 .

마지막 문자 (1 바이트 문자 인 경우)를 제거하려면 다음을 수행하십시오.

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


답변

Go 문자열은 null로 끝나지 않으며 문자열의 마지막 문자를 제거하려면 다음을 수행하면됩니다.

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


답변

길이가 0 인 입력에 대한 패닉을 피하려면 truncate 연산을 if

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


답변

이것은 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 인식 버전입니다.

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


답변

부분 문자열을 얻으려면

  1. “sp”의 위치 찾기

  2. 배열 논리로 문자열 자르기

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


답변

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