2013-06-05 44 views
5

Tôi chia một chuỗi bằng dấu cách:Sự khác nhau giữa [0] và [: 1] trong Go là gì?

splstr = strings.Split(str, " ") 

Sau đó, tôi lặp mỗi từ, và nhìn vào ký tự đầu tiên như thế này:

splstr[i][0] == "#" 

Nhưng tôi có các lỗi này từ dòng đó:

...: không thể chuyển đổi "#" thành loại uint8

...: hoạt động không hợp lệ: splstr [i] [ 0] == "#" (loại không phù hợp uint8 và chuỗi)

Nhưng sau đó tôi ghép nó:

splstr[i][:1] == "#" 

Và đó hoạt động. Tôi nhận được lý do tại sao [:1] thuộc loại string, nhưng tại sao là [0] loại uint8? (Tôi đang sử dụng Go 1.1.)

+1

'splstr [i] [0] == '# ''là hợp lệ (lưu ý dấu nháy đơn). Bạn đang lập chỉ mục các ký tự của chuỗi mà chính chúng không phải là chuỗi –

Trả lời

10

Bởi vì các ký hiệu mảng trên một chuỗi cho phép truy cập đến byte của chuỗi, như tài liệu trong spec ngôn ngữ:

http://golang.org/ref/spec#String_types

của một chuỗi byte có thể được truy cập bởi các chỉ số nguyên 0 đến len (s) -1.

(byte là một bí danh cho uint8)

3

[x:x] ([:x] là một hình thức [0:x]) sẽ cắt một miếng vào miếng khác trong khi [x] sẽ lấy đối tượng tại chỉ số x. Sự khác biệt được thể hiện dưới đây:

arr := "#####" 
fmt.Println(arr[:1]) // will print out a string 
fmt.Println(arr[0]) // will print out a byte 

Nếu string được chuyển thành []byte:

arr := []byte("#####") 
fmt.Println(arr[:1]) // will print out a slice of bytes 
fmt.Println(arr[0]) // will print out a byte 

Bạn có thể thử này cho mình ở http://play.golang.org/p/OOZQqXTaYK

Các vấn đề liên quan