2011-12-11 14 views
16

Gần đây tôi đã thử thêm hai mảng mảng byte vào Go và gặp một số lỗi lạ. Mã của tôi là:Làm cách nào để sử dụng tính năng Go, nối thêm hai lát hoặc mảng byte []?

one:=make([]byte, 2) 
two:=make([]byte, 2) 
one[0]=0x00 
one[1]=0x01 
two[0]=0x02 
two[1]=0x03 

log.Printf("%X", append(one[:], two[:])) 

three:=[]byte{0, 1} 
four:=[]byte{2, 3} 

five:=append(three, four) 

Và các lỗi là:

cannot use four (type []uint8) as type uint8 in append 
cannot use two[:] (type []uint8) as type uint8 in append 

nào đưa vào xem xét sự vững mạnh cáo buộc Go lát không phải là một vấn đề:

http://code.google.com/p/go-wiki/wiki/SliceTricks

gì Tôi đang làm sai, và làm thế nào tôi nên đi về phụ thêm hai mảng byte?

Trả lời

27

Appending to and copying slices

Chức năng variadic append gắn zero hoặc giá trị hơn x-s của loại S, mà cần phải có một loại lát và trả về lát cắt, cũng thuộc loại S. Các giá trị x được chuyển đến thông số loại ...T trong đó T là loại phần tử của S và thông số tương ứng đi qua quy tắc được áp dụng.

append(s S, x ...T) S // T is the element type of S

Passing arguments to ... parameters

Nếu đối số cuối cùng là chuyển nhượng cho một loại lát []T, nó có thể là trôi qua không thay đổi làm giá trị cho một tham số ...T nếu đối số là tiếp theo ....

Bạn cần sử dụng []T... cho đối số cuối cùng.

Ví dụ:

package main 

import "fmt" 

func main() { 
    one := make([]byte, 2) 
    two := make([]byte, 2) 
    one[0] = 0x00 
    one[1] = 0x01 
    two[0] = 0x02 
    two[1] = 0x03 
    fmt.Println(append(one[:], two[:]...)) 
    three := []byte{0, 1} 
    four := []byte{2, 3} 
    five := append(three, four...) 
    fmt.Println(five) 
} 
4

append() lấy một lát loại []T và sau đó là số lượng biến của các loại thành viên slice T. Nói cách khác, nếu bạn chuyển một số []uint8 làm lát đến append() thì nó muốn mọi đối số tiếp theo là uint8.

Giải pháp cho việc này là sử dụng cú pháp slice... để chuyển một lát thay cho đối số vararg. Mã của bạn sẽ trông như thế

log.Printf("%X", append(one[:], two[:]...)) 

five:=append(three, four...)