Tôi hiện đang học lập trình bằng ngôn ngữ Go. Tôi đang gặp một số khó khăn trong việc tìm hiểu các con trỏ đi (và C/C++ của tôi ở rất xa bây giờ ...). Trong Tour của Go # 52 (http://tour.golang.org/#52) ví dụ, tôi đọc:Con trỏ Golang
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Println(v.Abs())
}
Nhưng nếu thay vì
tôi đã viết:
func (v Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}
Hoặc thậm chí:
func (v Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}
và ngược lại:
func (v *Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}
Tôi nhận được kết quả tương tự. Có một sự khác biệt (trí nhớ, khôn ngoan, vv)?
Xin chào và chào mừng bạn đến với các lập trình viên. Các câu hỏi triển khai trực tiếp, chẳng hạn như đây là những chủ đề không có chủ đề ở đây nhưng về chủ đề về Stack Overflow. Tôi sẽ bắt đầu di chuyển. Có một ngày dễ chịu. –
Hãy thử thay đổi 'v' trong tất cả các phương thức, và sau đó là' fmt.Println() 'bản gốc sau cuộc gọi, và bạn sẽ thấy sự khác biệt. Với các phiên bản '(v Vertex)', bạn sẽ nhận được một bản sao của bản gốc. Nếu nó được gọi là trên một con trỏ, nó chỉ dereferenced cho bạn tự động. –
Xem thêm: [Phương thức nhận sự mơ hồ] (http://stackoverflow.com/questions/14926860/method-receivers-ambiguity) –