2013-05-08 25 views
6

Tôi mới đến golang, do đó, nếu bạn đặt câu hỏi này là quá ngây thơ thì rất thích hợp. Nhìn xung quanh, nhưng không thể tìm thấy câu trả lời cho câu hỏi cơ bản của tôi.Gõ kiểu xác nhận kiểu vs so với cấu trúc bê tông?

Cho phép nói rằng tôi có cấu trúc và phương pháp cụ thể như được hiển thị bên dưới.

type MyData struct{ 
    field1 string 
    field2 int 
    } 

func(a MyData) OperatorOnString() string{ 
    return a.field1.(string) 
} 

func(a MyData) OperatorOnInt() int{ 
    return a.field2.(int) 
} 

Câu hỏi của tôi là, tôi có thể nhập và truyền lại thay vì thực hiện xác nhận không? Từ những gì tôi đã học được cho đến nay là, khẳng định được sử dụng trên dữ liệu của giao diện kiểu. Nhưng trong trường hợp này tôi có loại bê tông. Tôi vẫn nên sử dụng khẳng định hoặc tôi có thể làm một cái gì đó như return int(a.field2). Tôi biết ví dụ này là tầm thường, nhưng điểm mà tôi bối rối là khi nào sử dụng giữa hai loại chuyển đổi. Hay có một số thành ngữ golang có liên quan ở đây không?

Cảm ơn

Trả lời

9

Trước hết, type assertion có thể được sử dụng trên giao diện:

Đối với một biểu x kiểu giao diện và một loại T, khái niệm chính

x.(T) 

khẳng định rằng x không phải là số không và giá trị được lưu trữ trong x là loại T. Ký hiệu x.(T) được gọi là xác nhận kiểu.

Nhưng bạn đang áp dụng nó cho các trường không có giao diện được nhập (intstring). Điều đó làm cho trình biên dịch unhappy.

Thứ hai, nếu bạn muốn trả về loại T từ phương thức/chức năng, nó luôn đủ để trả lại một biểu thức thuộc loại T, mà trường của bạn đã xảy ra. Mã đúng là sau đó dễ dàng:

package main 

import "fmt" 

type MyData struct { 
     field1 string 
     field2 int 
} 

func (a MyData) OperatorOnString() string { 
     return a.field1 
} 

func (a MyData) OperatorOnInt() int { 
     return a.field2 
} 

func main() { 
     a := MyData{"foo", 42} 
     fmt.Println(a.OperatorOnString(), a.OperatorOnInt()) 
} 

Playground


Output:

foo 42 
+0

Cảm ơn. Tuy nhiên trong kịch bản thực tế, các toán tử của tôi sẽ có một số đối số sẽ được sử dụng để hoạt động trên các trường MyData. Do đó trước khi trở về lĩnh vực đó, tôi có cần phải kiểm tra loại? – Minty

+0

@Minty: Hiển thị mã thực. Có lẽ bạn đang trộn nhiều khái niệm và nó sẽ không tốt hơn nếu không có mã thực. – Volker

+1

@Minty: Nếu kiểu trả về fn 'T' thì chỉ các biểu thức kiểu' T' mới xuất hiện trong 'return expr'. Nó không phải về các lĩnh vực, đó là về loại biểu thức. Ví dụ. nếu nói rằng chúng ta có 'var i int' trong một fn trả về' int64' thì chúng ta có thể và phải viết 'return int64 (i)'. Quảng cáo "để kiểm tra loại": Loại kiểm tra được thực hiện bởi trình biên dịch cho bạn tự động. – zzzz

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