Làm thế nào để lập chỉ mục các ký tự trong một chuỗi Golang?


101

Làm thế nào để có đầu ra "E" thay vì 69?

package main

import "fmt"

func main() {
    fmt.Print("HELLO"[1])
}

Golang có chức năng chuyển đổi một char sang byte và ngược lại không?

Câu trả lời:


150

Các ký tự chuỗi được thông dịch là chuỗi ký tự nằm giữa dấu ngoặc kép "" bằng cách sử dụng mã hóa UTF-8 (có thể là nhiều byte) của các ký tự riêng lẻ. Trong UTF-8, các ký tự ASCII là byte đơn tương ứng với 128 ký tự Unicode đầu tiên. Các chuỗi hoạt động giống như các lát byte. Rune là một giá trị số nguyên xác định một điểm mã Unicode. Vì thế,

package main

import "fmt"

func main() {
    fmt.Println(string("Hello"[1]))              // ASCII only
    fmt.Println(string([]rune("Hello, 世界")[1])) // UTF-8
    fmt.Println(string([]rune("Hello, 世界")[8])) // UTF-8
}

Đầu ra:

e
e
界

Đọc:

Chuyển đến phần Đặc tả ngôn ngữ lập trình trên Chuyển đổi .

Blog cờ vây: Chuỗi, byte, rune và ký tự trong cờ vây


19

Làm thế nào về điều này ?

fmt.Printf("%c","HELLO"[1])

Như Peter chỉ ra, để cho phép nhiều hơn chỉ ASCII:

fmt.Printf("%c", []rune("HELLO")[1])

10

Có thể được thực hiện thông qua quá trình cắt

package main

import "fmt"

func main() {
    fmt.Print("HELLO"[1:2])
}

LƯU Ý: Giải pháp này chỉ hoạt động đối với các ký tự ASCII.


điều này chỉ hoạt động với các mã hóa một byte, hãy thử "हैलो"[:1]nó mang lại cho bạn
vladkras

@vladkras Bạn nói đúng. Nó chỉ hoạt động với ASCII. Đối với UTF-8, hãy xem câu trả lời đã được phê duyệt. Tôi cũng sẽ chỉnh sửa giải pháp với thông tin này.
Samkit Jain

7

Go không thực sự có một kiểu ký tự như vậy. byte thường được sử dụng cho các ký tự ASCII và rune được sử dụng cho các ký tự Unicode, nhưng chúng chỉ là bí danh cho các kiểu số nguyên (uint8 và int32). Vì vậy, nếu bạn muốn buộc chúng phải được in dưới dạng ký tự thay vì số, bạn cần phải sử dụng Printf("%c", x). Đặc %ctả định dạng hoạt động cho bất kỳ kiểu số nguyên nào.


5

Bạn cũng có thể thử đánh máy nó bằng chuỗi.

package main

import "fmt"

func main() {
    fmt.Println(string("Hello"[1]))
}

4

Giải pháp chung để giải thích một biểu đồ dưới dạng một chuỗi là string("HELLO"[1]).

Tất nhiên, giải pháp của Rich cũng hoạt động.


0

Hãy thử điều này để lấy các charecters theo chỉ mục của chúng

package main

import (
      "fmt"
      "strings"
)

func main() {
   str := strings.Split("HELLO","")
    fmt.Print(str[1])
}

0

Các ký tự chuỗi là rune, vì vậy để in chúng, bạn phải chuyển chúng trở lại thành Chuỗi.

fmt.Print(string("HELLO"[1]))


-3

Một giải pháp khác để cô lập một ký tự trong một chuỗi

package main
import "fmt"

   func main() {
        var word string = "ZbjTS"

       // P R I N T 
       fmt.Println(word)
       yo := string([]rune(word)[0])
       fmt.Println(yo)

       //I N D E X 
       x :=0
       for x < len(word){
           yo := string([]rune(word)[x])
           fmt.Println(yo)
           x+=1
       }

}

đối với mảng chuỗi cũng có:

fmt.Println(string([]rune(sArray[0])[0]))

// = dòng bình luận


11
Thực sự,rất tệ sẽ làm rối loạn đầu vào Unicode ( len("cafés")> len([]rune("cafés"))và có thể chuyển đổi lại chuỗi trên mỗi lần lặp cho, O (n²). Chỉ cần làm for _, r := range word { fmt.Printf("%c", r) }. Nếu bạn thực sự muốn lặp lại với một chỉ mục for x := 0; x < limit; x++. Vui lòng tìm hiểu kiến ​​thức cơ bản về một ngôn ngữ trước khi trả lời câu hỏi.
Dave C
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.