2015-01-12 17 views
11

Tôi đã cố gắng xác định cấu trúc có giá trị chuỗi (tên). reflect.TypeOf trả về Type.xác nhận loại golang bằng cách sử dụng reflect.Typeof()

Nhưng xác nhận loại cần một type.

Tôi làm cách nào để có thể truyền Type đến type?

Hoặc bất kỳ đề xuất nào để xử lý?

http://play.golang.org/p/3PJG3YxIyf

package main 

import (
"fmt" 
"reflect" 
) 
type Article struct { 
    Id    int64  `json:"id"` 
    Title   string  `json:"title",sql:"size:255"` 
    Content  string  `json:"content"` 
} 


func IdentifyItemType(name string) interface{} { 
    var item interface{} 
    switch name { 
    default: 
     item = Article{} 
    } 
    return item 
} 

func main() { 

    i := IdentifyItemType("name") 
    item := i.(Article) 
    fmt.Printf("Hello, item : %v\n", item) 
    item2 := i.(reflect.TypeOf(i)) // reflect.TypeOf(i) is not a type 
    fmt.Printf("Hello, item2 : %v\n", item2) 

} 
+6

Điều này hoàn toàn không thể thực hiện được trong Go.Xác nhận kiểu xác nhận kiểu tĩnh cố định biên dịch-thời gian cố định. Bạn phải làm lại giải pháp của bạn. – Volker

+0

Cảm ơn nhận xét. Nó rất rõ ràng! – dorajistyle

Trả lời

4

Xác nhận kiểu, cú pháp, có một loại trong dấu ngoặc đơn, không phải biểu thức. Vì vậy, nó là một lỗi cú pháp.

Dường như bạn đang cố gắng thực hiện xác nhận loại với giá trị được tính khi chạy. Điều đó có ý nghĩa? Hãy suy nghĩ về xác nhận loại là gì.

Một loại khẳng định bao gồm hai điều:

  1. Tại thời gian biên dịch: Nó gây ra các biểu hiện kết quả có loại thời gian biên dịch mong muốn. Biểu thức x.(T) có loại thời gian biên dịch T. Điều này cho phép bạn thực hiện công việc biểu thức mà bạn có thể thực hiện với loại T, mà bạn có thể không thực hiện được với loại x.
  2. Khi chạy: Kiểm tra xem giá trị có phải là nil và thực sự thuộc loại đã cho hay không và nếu không, nó sẽ gây ra sự hoảng sợ.

Phần đầu tiên rõ ràng không có ý nghĩa đối với loại được tính khi chạy. Loại thời gian biên dịch của biểu thức kết quả không thể phụ thuộc vào một thứ không được biết tại thời gian biên dịch.

Điều thứ hai (kiểm tra thời gian chạy) có thể được thực hiện với một loại được tính khi chạy. Một cái gì đó như:

if reflect.TypeOf(x) != someTypeComputedAtRuntime { 
    panic(42) 
} 
5

Nếu bạn cần bật loại giao diện ngoài {} bạn sẽ không cần phản ánh.

switch x.(type){ 
    case int: 
    dosomething() 
} 

... nhưng nếu bạn cần phải chuyển đổi vào loại các thuộc tính trong một giao diện thì bạn có thể làm điều này:

s := reflect.ValueOf(x) 
for i:=0; i<s.NumValues; i++{ 
    switch s.Field(i).Interface().(type){ 
    case int: 
     dosomething() 
    } 
} 

tôi đã không tìm thấy một cách sạch hơn, tôi muốn thích biết nếu nó tồn tại.

0

Tôi nghĩ rằng bạn có thể sử dụng để giải quyết valueOf này

item2 := reflect.ValueOf(i) 
fmt.Printf("Hello, item2 : %v\n", item2) 
+1

ValueOf() trả về một kiểu reflect.Value không phải là kiểu cơ bản thực sự của giao diện ... – MonkeyButter

1

Nếu bạn có thể xử lý tiếng ồn và thực hiện một phương pháp phụ trợ tất cả các loại thực hiện ví dụ 'Loại() chuỗi', bạn có thể làm một cái gì đó như thế này:

 ve := &ValidationError{} 
     nf := &NotFound{} 

     switch err.Type() { 
     case ve.Type() : 
      SendBadRequest(w, err) 
     case nf.Type() : 
      http.NotFound(w, r) 
     default: 
      SendInternalError(w, err) 
     } 
     return 
Các vấn đề liên quan