편집 # 2 : 다시 질문의 "의미"새로운 유형의 표시 : 당신이 []rune
에 string
를 검색 할 수 있습니다.
답변 : 표준 라이브러리에서는 직접 지원되지 않습니다.
func search(text []rune, what string) int {
whatRunes := []rune(what)
for i := range text {
found := true
for j := range whatRunes {
if text[i+j] != whatRunes[j] {
found = false
break
}
}
if found {
return i
}
}
return -1
}
시험이 :
value := []rune("123}456}}789")
result := search(value, "}}")
fmt.Println(result)
출력합니다 (Go Playground에 그것을 시도) :
7
편집 그러나 2 개 for
루프와 그것을 구현하기 쉽습니다 : 검색하려는 질문을 업데이트했습니다. 에있는
쉽게 변환 할 수있는 []rune
간단한 형식 변환 사용 string
A와 :
if i := strings.Index(text[offset:], toSearch); i > 0 {
print(i)
}
보십시오 : 당신이 당신의 예에서와 마찬가지로
이
toSearchRunes := []rune{'}', '}'}
toSearch := string(toSearchRunes)
그리고 거기에에서, 당신은 strings.Index()
을 사용할 수 있습니다 Go Playground에 있습니다.
원래 대답은 다음과 이동에
string
값이 UTF-8로 인코딩 된 바이트로 저장됩니다. strings.Index()
은 주어진 하위 문자열이 발견되면 바이트 위치를 반환합니다.
기본적으로 원하는 것은이 바이트 위치를 룬 위치로 변환하는 것입니다. unicode/utf8
패키지에는 string
의 룬 - 계수 또는 룬 길이를 알려주는 유틸리티 함수가 포함되어 있습니다. utf8.RuneCountInString()
.
그래서 기본적으로 당신은 단지이 함수에 문자열을 전달해야
offset := 0
text := "123456789}}56"
if i := strings.Index(text[offset:], "}}"); i > 0 {
fmt.Println("byte-pos:", i, "rune-pos:", utf8.RuneCountInString(text[offset:i]))
}
text = "世界}}世界"
if i := strings.Index(text[offset:], "}}"); i > 0 {
fmt.Println("byte-pos:", i, "rune-pos:", utf8.RuneCountInString(text[offset:i]))
}
출력합니다 (Go Playground에 그것을 시도) :
byte-pos: 9 rune-pos: 9
byte-pos: 6 rune-pos: 2
참고 : offset
또한 바이트 위치해야합니다, string
을 자르는 경우 text[offset:]
과 같이 인덱스가 바이트 인덱스로 해석되기 때문입니다.
rune
의 색인을 얻으려면 strings.Index()
대신 strings.IndexRune()
을 사용하십시오.