Menu Close

Golang: Value receiver vs Pointer receiver

Value receiver

Với ví dụ như sau:

type Foo struct{
  Data string
}
func (f Foo) funcA(){
  f.Data = "XXX"
}

Hàm funcA như trên có đối tượng thực hiện là ở dạng value (value receiver – (f Foo)). Nó có nghĩa, khi thực hiện hàm funcA trên 1 đối tượng của Foo thì đối tượng đó được gọi bên trong hàm chỉ là bản sao chép. Đối tượng bên trong hàm và đối tượng thực có địa chỉ vùng nhớ khác nhau nên mọi sự tác động lên đối tượng bản sao không ảnh hưởng bản gốc

Pointer receiver

Với ví dụ như sau:

type Foo struct{
  Data string
}
func (f *Foo) funcA(){
  f.Data = "XXX"
}

Hàm funcA sẽ thực hiện trên trực tiếp đối tượng thực bởi lẻ lúc này đối tượng được sử dụng trong hàm là một tham chiếu có chung địa chỉ với đối tượng thực và nên mọi sự thay đổi bên trong hàm cũng ảnh hưởng bên ngoài.

Leave a Reply

Your email address will not be published. Required fields are marked *