2014-07-25 19 views
5

Tôi đã đọc một Tour of Go và Go hiệu quả, http://golang.org/doc/effective_go.html#pointers_vs_values, nhưng vẫn còn khó hiểu khi bạn định nghĩa một phương thức trên một struct. phương thức nhận. Nói cách khác, khi nào điều này:Phương thức nhận giá trị của Go so với phương thức nhận con trỏ

type ByteSlice []byte 

func (slice ByteSlice) Append(data []byte) []byte { 
} 

thích hợp hơn điều này?

func (p *ByteSlice) Append(data []byte) { 
    slice := *p 
    *p = slice 
} 

Trả lời

4

Lát là một nơi không phải lúc nào cũng rõ ràng lúc đầu. Tiêu đề Slice nhỏ, vì vậy sao chép nó rẻ và mảng cơ bản được tham chiếu qua một con trỏ, vì vậy bạn có thể thao tác nội dung của một slice với một bộ nhận giá trị. Bạn có thể thấy điều này trong gói sort, trong đó các phương thức cho các loại có thể sắp xếp được xác định mà không có con trỏ.

Lần duy nhất bạn cần sử dụng con trỏ với một lát, là nếu bạn định thao tác tiêu đề lát, điều đó có nghĩa là thay đổi độ dài hoặc dung lượng. Đối với phương thức Append, bạn sẽ muốn:

func (p *ByteSlice) Append(data []byte) { 
    *p = append(*p, data...) 
} 
2

Có một mục Hỏi đáp về vấn đề đó:

Đầu tiên, và quan trọng nhất, không phương pháp này cần phải sửa đổi người nhận? Nếu có, người nhận phải là một con trỏ.

...

Second là việc xem xét hiệu quả. Nếu người nhận là lớn, một cấu trúc lớn ví dụ, nó sẽ rẻ hơn nhiều để sử dụng một máy thu con trỏ.

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