2013-10-15 26 views
6

Tôi đang sử dụng phản ánh gói để có được những loại mảng tùy ý, nhưng nhậnGolang: có được các loại lát

prog.go:17: cannot use sample_array1 (type []int) as type []interface {} in function argument [process exited with non-zero status] 

Làm thế nào để có được các loại từ mảng? Tôi biết làm thế nào để có được nó từ giá trị.

func GetTypeArray(arr []interface{}) reflect.Type { 
     return reflect.TypeOf(arr[0]) 
    } 

http://play.golang.org/p/sNw8aL0a5f

Trả lời

4

Thay đổi:

GetTypeArray(arr []interface{}) 

tới:

GetTypeArray(arr interface{}) 

Bằng cách này, []int không phải là một mảng nhưng một lát của số nguyên.

+3

Điều này không giải quyết được vấn đề về hoảng loạn lập chỉ mục tiềm năng. Xem câu trả lời của tôi. – Mike

+0

@Mike Mặc dù bạn đúng, nhưng đó không phải là câu hỏi (bao gồm một lỗi rất cụ thể để giải quyết) và do đó nó nằm ngoài phạm vi ở đây. – thwd

+2

Tiêu đề của câu hỏi là "Golang, Go: lấy loại mảng", và đó là những gì tôi đang tìm kiếm khi tôi tìm thấy nó. Tôi không cho rằng đó là lỗi của bạn hoặc bạn đã bỏ lỡ nó. Tuy nhiên, điều quan trọng là nó được giải quyết vì tôi gần như đã sử dụng mã này mà không nhận thấy lỗi hoặc thực tế là giải pháp là tối ưu. Tôi không cố gắng thách thức bạn, tôi chỉ nghĩ nó quan trọng. – Mike

18

Thực tế là bạn đang lập chỉ mục lát không an toàn - nếu nó trống, bạn sẽ nhận được hoảng loạn thời gian chạy không nằm trong phạm vi chỉ mục. Bất kể, đó là không cần thiết vì sự reflect package's Elem() method:

type Type interface { 

    ... 

    // Elem returns a type's element type. 
    // It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice. 
    Elem() Type 

    ... 
} 

Vì vậy, đây là những gì bạn muốn sử dụng:

func GetTypeArray(arr interface{}) reflect.Type { 
     return reflect.TypeOf(arr).Elem() 
} 

Lưu ý rằng, theo @ tomwilde của sự thay đổi, tranh luận arr có thể là hoàn toàn bất kỳ loại , do đó, không có gì ngăn cản bạn chuyển số GetTypeArray() một giá trị không cắt vào thời gian chạy và bị hoảng sợ.

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