Go – Phương thức

Go không phải là ngôn ngữ lập trình hướng đối tượng. Nó không có class, object và kế thừa. Tuy nhiên, Go có kiểu dữ liệu và có thể định nghĩa phương thức trong kiểu dữ liệu. Điều này cho phép lập trình hướng đối tượng trong Go.

Phương thức chỉ là một hàm với một kiểu receiver đặc biệt giữa từ khoá func và tên phương thức. Tham số recevier có tên và kiểu.

Tham số receiver có thể là kiểu struct hoặc không.

Hãy cùng xem ví dụ sau để hiểu về cách định nghĩa một phương thức trên một kiểu và làm thế nào để gọi phương thức như vậy

Kết quả

Chú ý cách chúng ta gọi phương thức IsAbove() trên instance Point p. Nó chính xác giống như cách bạn gọi các phương thức trong các ngôn ngữ lập trình hướng đối tượng.

Phương thức là hàm

Do phương thức chỉ là một hàm với một tham số receiver. Chúng ta có thể viết ví dụ trên sử dụng một hàm bình thường như sau

Tại sao sử dụng phương thức thay cho hàm

Phương thức giúp cho chúng ta viết code theo kiểu hướng đối tượng. Gọi các phương thức là dễ đọc và dễ hiểu hơn gọi hàm.

Ngoài ra, giúp chúng ta tránh bị xung đột trong cách đặt tên. Bởi vì một phương thức sẽ liên quan đến receiver cụ thể. Chúng ta có thể có các phương thức trùng tên nhưng khác kiểu receiver.

Kết quả

Phương thức với con trỏ receiver.

Tất cả các ví dụ trước chúng ta đều nhìn thấy receiver giá trị.

Với receiver giá trị, phương thức hoạt động dựa trên bản sao của giá trị được truyền vào cho nó. Do đó bất kỳ thay đổi nào bên trong receiver đều không thấy được ở phía gọi.

Go cho phép chúng ta định nghĩa phương thức với  receiver con trỏ.

Phương thức với receiver con trỏ có thể thay đổi giá trị mà trỏ đến receiver. Những thay đổi được thấy phía bên gọi của phương thức.

Kết quả

Phương thức với  receiver con trỏ bằng hàm

Cũng giống như phương thức với các  receiver giá trị, chúng ta cũng có thể viết các phương thức với các  receiver con trỏ bằng các hàm. Hãy cùng xem ví dụ sau để hiểu về cách viết lại ví dụ trên sử dụng hàm

Phương thức và con trỏ gián tiếp

Phương thức với receiver con trỏ vs Hàm với tham số con trỏ

Một phương thức với receiver con trỏ có thể nhận cả con trỏ và giá trị là tham số recevier. Nhưng một hàm với tham số truyền vào là con trỏ thì chỉ nhận một con trỏ duy nhất.

Chú ý rằng cách gọi các p.Translate() và ptr.Translate() hợp lệ. Do Go hiểu rằng phương thức Translate() có một receiver con trỏ. Nó thông dịch câu lệnh p.Translate() thành (&p).Translate().

Phương thức với receiver giá trị vs Hàm với tham số giá trị

Một phương thức với một receiver giá trị có thể nhận cả con trỏ và giá trị như tham số receiver. Nhưng một hàm với tham số giá trị có thể chỉ nhận một giá trị

Cả 2 câu lệnh p.IsAbove() và ptr.IsAbove() đều hợp lệ. Go hiểu rằng phương thức IsAbove() có receiver giá trị. Do đó, để cho thuận lợi nó thông dịch ptr.IsAbove() thành (*ptr).IsAbove()

Hạn chế định nghĩa phương thức

Để có thể định nghĩa một phương thức trên receiver, kiểu receiver phải được định nghĩ trong cùng package.

Go không cho phép bạn định nghĩa một phương thức trên kiểu recevier được định nghĩa trên package khác nhau (cái này bao gồm cả những kiểu tích hợp sẵn như là int)

Trong các ví dụ trước chúng ta đã định nghĩa trên cùng package main, do đó hoạt động tốt. Tuy nhiên, nếu chúng ta thử định nghĩa phương thức trên kiểu được định nghĩa trên các package khác nhau, trình biên dịch sẽ báo lỗi.

Hãy cùng xem ví dụ với cấu trúc package như sau

person.go

Hãy thử định nghĩa một phương thức trên struct Person.

Định nghĩa phương thức trên kiểu không phải struct

Go cũng cho phép chúng ta định nghĩa kiểu không phải struct. Trong ví dụ sau đây định nghĩa một phương thức được gọi là reverse() trên kiểu MyString

Kết quả

 

 

 

You May Also Like

About the Author: Nguyen Dinh Thuc

3
Leave a Reply

avatar
2 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
Nguyen Dinh ThucThuc Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Thuc
Guest
Thuc

Go lang