วิธีการในGolang นั้นเหมือนกับฟังก์ชัน แต่มีความแตกต่างที่สำคัญอย่างหนึ่งคือ มี อาร์กิวเมนต์ ตัวรับซึ่งทำให้เข้าถึงคุณสมบัติของตัวรับได้ ตัวรับสามารถเป็นชนิด struct หรือ non-struct ได้ แต่ทั้งสองจะต้องอยู่ในแพ็คเกจเดียวกัน ไม่สามารถสร้างวิธีการสำหรับประเภทที่กำหนดไว้ในแพ็คเกจอื่นได้ รวมถึงประเภทในตัวเช่นintหรือstringหากเป็นเช่นนั้น คอมไพเลอร์จะรายงานข้อผิดพลาด

ตัวอย่างเช่น:
package main
import "fmt"
// Định nghĩa một struct
type person struct {
name string
age int
}
// Định nghĩa một phương thức với struct receiver
func (p person) display() {
fmt.Println("Name:", p.name)
fmt.Println("Age:", p.age)
}
func main() {
// Tạo một phiên bản của struct
a := person{name: "a", age: 25}
// Gọi phương thức
a.display()
}
ผลลัพธ์:
Name: a
Age: 25
ไวยากรณ์
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
ผู้รับ :สามารถเข้าถึงได้ด้วยวิธีนี้
วิธีการที่มีตัวรับประเภทโครงสร้าง
ใน Go คุณสามารถกำหนดวิธีการที่ตัวรับเป็นประเภท struct ได้ ผู้รับสามารถเข้าถึงได้ภายในวิธีการ ตัวอย่างก่อนหน้านี้แสดงให้เห็นแนวทางนี้โดยใช้ตัวรับประเภท struct
วิธีการที่มีตัวรับไม่ใช่ประเภทโครงสร้าง
Go ยังอนุญาตให้มีวิธีการที่มีตัวรับที่ไม่ใช่โครงสร้างได้ ตราบใดที่ประเภทตัวรับและคำจำกัดความของวิธีการอยู่ในแพ็คเกจเดียวกัน คุณไม่สามารถกำหนดวิธีการที่มีประเภทตัวรับจากแพ็คเกจอื่นได้ (เช่น int, สตริง)
ตัวอย่างเช่น:
package main
import "fmt"
// Tạo một kiểu tùy biến dựa trên int
type number int
// Định nghĩa một phương thức với receiver không phải struct
func (n number) square() number {
return n * n
}
func main() {
a := number(4)
b := a.square()
fmt.Println("Square of", a, "is", b)
}
ผลลัพธ์:
Square of 4 is 16
วิธีการที่มีตัวชี้ตัวรับ
ใน Go วิธีการสามารถมีตัวรับตัวชี้ได้ วิธีนี้จะช่วยให้การเปลี่ยนแปลงที่ทำในวิธีการสะท้อนไปยังตัวเรียก ซึ่งไม่สามารถทำได้กับตัวรับค่า
รูปแบบประโยค :
func (p *Type) method_name(...Type) Type { // Code}
ตัวอย่างเช่น:
package main
import "fmt"
// Defining a struct
type person struct {
name string
}
// Phương thức với receiver pointer để chỉnh sửa dữ liệu
func (p *person) changeName(newName string) {
p.name = newName
}
func main() {
a := person{name: "a"}
fmt.Println("Before:", a.name)
// Gọi phương thức này để thay đổi tên
a.changeName("b")
fmt.Println("After:", a.name)
}
ผลลัพธ์:
Before: a
After: b
วิธีการนี้ยอมรับทั้งตัวชี้และค่า
ต่างจากฟังก์ชัน วิธีการของ Go สามารถรับทั้งตัวรับค่าและตัวชี้ได้ คุณสามารถส่งตัวชี้หรือค่าได้ และวิธีการจะจัดการตามนั้น
ตัวอย่างเช่น:
package main
import "fmt"
type person struct {
name string
}
// Phương thức với receiver pointer
func (p *person) updateName(newName string) {
p.name = newName
}
// Phương thức với receiver value
func (p person) showName() {
fmt.Println("Name:", p.name)
}
func main() {
a := person{name: "a"}
// Gọi phương thức con trỏ cùng giá trị
a.updateName("b")
fmt.Println("After pointer method:", a.name)
// Gọi phương thức giá trị với con trỏ
(&a).showName()
}
ผลลัพธ์:
After pointer method: b
Name: b
ความแตกต่างระหว่างวิธีการและฟังก์ชั่น
| วิธี |
ขากรรไกร |
| มีตัวรับสัญญาณ |
ไม่มีตัวรับสัญญาณ |
| สามารถกำหนดวิธีการที่มีชื่อเดียวกัน แต่มีประเภทที่แตกต่างกันได้ |
ไม่อนุญาตให้ใช้ฟังก์ชั่นที่มีชื่อเดียวกันแต่มีประเภทต่างกัน |
| ไม่สามารถใช้เป็นคำคุณศัพท์ขั้นยอดได้ |
สามารถใช้เป็นวัตถุเหนือกว่าได้ |