2011-11-07 37 views
20

Có cách nào thuận tiện cho mảng byte ban đầu không?chuyển đổi chuỗi thành mảng byte có kích thước cố định trong Go

package main 
import "fmt" 
type T1 struct { 
    f1 [5]byte // I use fixed size here for file format or network packet format. 
    f2 int32 
} 
func main() { 
    t := T1{"abcde", 3} 
    // t:= T1{[5]byte{'a','b','c','d','e'}, 3} // work, but ugly 
    fmt.Println(t) 
} 

prog.go: 8: không thể sử dụng "abcde" (loại string) as type [5] uint8 trong giá trị trường

nếu tôi thay đổi dòng để t := T1{[5]byte("abcde"), 3}

prog.go: 8: không thể chuyển đổi "abcde" (loại chuỗi) thành [5] uint8

+0

Điều này tương tự như: http://stackoverflow.com/questions/8032170/how-to-assign-string-to-bytes-array. – jimt

Trả lời

9

Bạn có thể sao chép các chuỗi vào một lát mảng byte:

package main 
import "fmt" 
type T1 struct { 
    f1 [5]byte 
    f2 int 
} 
func main() { 
    t := T1{f2: 3} 
    copy(t.f1[:], "abcde") 
    fmt.Println(t) 
} 

Chỉnh sửa: sử dụng hình thức tên của T1 theo nghĩa đen, theo gợi ý của jimt của.

+0

Trong phương pháp này, tác phẩm sao chép sẽ bị trì hoãn trong thời gian chạy thay vì biên dịch. Tôi có đúng không? –

+0

@DanielYCLin: Đúng vậy. Ví dụ được hiển thị ở đây cũng có thể thực hiện mà không có bit '[5] byte {}' trong bộ khởi tạo cấu trúc. Một trường cấu trúc mảng cố định đã được khởi tạo. Không cần phải làm điều đó hai lần: 't: = T1 {f2: 3}; copy (t.f1 [:], "abcde") '. – jimt

+0

Bản sao không thể xảy ra tại thời gian biên dịch trong cả hai trường hợp. Trong cả hai trường hợp, dữ liệu sẽ được sao chép vào ngăn xếp hoặc vào đống từ dữ liệu chương trình. Ngoài ra, trong khi tôi sẽ đồng ý rằng các hình thức được đặt tên là đẹp hơn (tôi đã xem xét việc sử dụng nó, nhưng quyết định không), mảng không được khởi tạo hai lần trong mã tôi đăng. – SteveMcQwark

12

Có lý do cụ thể nào bạn cần một mảng byte không? Trong Go, bạn sẽ tốt hơn bằng cách sử dụng một lát byte thay thế.

package main 
import "fmt" 

type T1 struct { 
    f1 []byte 
    f2 int 
} 

func main() { 
    t := T1{[]byte("abcde"), 3} 
    fmt.Println(t) 
} 
+3

Tôi yêu cầu mảng byte để thực hiện chuyển gói dữ liệu qua mạng, lưu dữ liệu của tôi vào tệp. –

+2

Nếu bạn muốn làm điều đó, bạn cũng nên sử dụng một int có kích thước cố định (int32, int64). – SteveMcQwark

+0

Cảm ơn, SteveMcQwark, tôi đã sửa đổi câu hỏi của mình để rõ ràng hơn. –

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