2016-09-13 20 views
5

Bối cảnh: Tôi muốn sử dụng cấu trúc dữ liệu lát cắt trong golang để tạo vectơ tính năng 2 chiều. Vector tính năng này phải là một lát bao gồm các lát của các loại khác nhau, đôi khi là chuỗi, int, float64, v.v.Lát lát có nhiều loại khác nhau trong golang

Tuy nhiên, tôi có thể đạt được điều này với bản đồ (bên dưới), có cách nào để thực hiện điều này không một lát cắt?

map := make(map[int]interface{}} 

gì nên được như thế hơn:

featureVector := []interface{[]int, []float64, []string ...} 

Trả lời

5

Nó hoạt động như mong đợi, bạn chỉ cần sử dụng cú pháp sai. Các loại nguyên tố của slice là interface{}, do đó, một composite literal để khởi tạo nó sẽ giống như []interface{}{ ... }, như trong ví dụ này:

featureVector := []interface{}{[]int{1, 2}, []float64{1.2, 2.2}, []string{"a", "b"}} 

Và bạn có thể đối xử với nó như bất kỳ lát khác:

featureVector = append(featureVector, []byte{'x', 'y'}) 
fmt.Printf("%#v", featureVector) 

Output (hãy thử nó trên Go Playground):

[]interface{}{[]int{1, 2}, []float64{1.2, 2.2}, []string{"a", "b"}, []uint8{0x78, 0x79}} 

Nhưng biết rằng vì loại phần tử là interface{}, không có gì ngăn cản bất kỳ ai nối thêm một lát không:

featureVector = append(featureVector, "abc") // OK 

Điều này cũng áp dụng với giải pháp map.

+0

Vâng, nếu chúng tôi là kỹ thuật, chuỗi là _essentially_ slice. Chúng được tự do chuyển đổi thành '[] byte' và ngược lại. Sự khác biệt chức năng duy nhất là các slice không thay đổi, và cấu trúc header slice của chúng là một từ máy nhỏ hơn bởi vì cap và len của chúng được định nghĩa bằng nhau. – Kaedys

+0

@Kaedys Việc thêm một giá trị 'chuỗi' duy nhất chỉ là một ví dụ, tôi có thể vừa sử dụng' int'. Và nếu chúng ta đang ở đó: một 'chuỗi' là một lát chỉ đọc các byte _in effect_, nhưng nó không phải là một slice. Đặc tả ngôn ngữ cho phép xử lý nó tương tự như một slice trong nhiều trường hợp, nhưng vẫn là 'reflect.TypeOf (" abc "). Kind() == reflect.Slice' là' false'. – icza

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