Trong cấu trúc Golang, cách thức hoạt động của các phương thức được khuyến khích cũng giống như các trường được khuyến nghị. Chúng ta sử dụng khái niệm này trong cấu trúc lồng nhau, trong đó một cấu trúc là một trường trong một cấu trúc khác, chỉ cần thêm tên của cấu trúc vào một cấu trúc khác và nó hoạt động giống như trường ẩn danh đối với cấu trúc lồng nhau. Các phương thức của cấu trúc đó (khác với cấu trúc lồng nhau) là một phần của cấu trúc lồng nhau, loại phương thức như vậy được gọi là các phương thức được thúc đẩy. Hay nói cách khác, các phương thức được nhắc là các phương thức được triển khai bởi cấu trúc con và có thể truy cập được bởi cấu trúc cha.
Các điểm quan trọng cần ghi nhớ:
- Nếu cấu trúc con và cấu trúc cha chứa một phương thức có cùng tên nhưng khác loại receiver, thì cả hai phương thức đều có sẵn trong cấu trúc cha như được hiển thị ở Ví dụ 2. Ở đây, cả cấu trúc con và cấu trúc cha đều chứa các phương thức có cùng tên.
- Nếu cấu trúc con chứa hai phương thức có cùng tên và cùng receiver, thì các phương thức này không được quảng bá trong cấu trúc cha và nếu thử thực hiện, thì trình biên dịch sẽ báo lỗi.
Ví dụ 1:
// Chương trình Go minh họa
// khái niệm các phương thức được khuyến khích
package main
import "fmt"
// Cấu trúc
type details struct {
// Trường
// cấu trúc chi tiết
name string
age int
gender string
psalary int
}
// Cấu trúc lồng nhau
type employee struct {
post string
eid int
details
}
// Phương thức
func (d details) promotmethod(tsalary int) int {
return d.psalary * tsalary
}
func main() {
// Khởi tạo các trường của
// cơ cấu nhân viên
values := employee{
post: "HR",
eid: 4567,
details: details{
name: "Sumit",
age: 28,
gender: "Male",
psalary: 890,
},
}
// Các trường được khuyến khích của
// cơ cấu nhân viên
fmt.Println("Name: ", values.name)
fmt.Println("Age: ", values.age)
fmt.Println("Gender: ", values.gender)
fmt.Println("Per day salary: ", values.psalary)
// Phương thức được khuyến nghị của
// cơ cấu nhân viên
fmt.Println("Total Salary: ", values.promotmethod(30))
// Các trường bình thường của
// cơ cấu nhân viên
fmt.Println("Post: ", values.post)
fmt.Println("Employee id: ", values.eid)
}
Kết quả:
Name: Sumit
Age: 28
Gender: Male
Per day salary: 890
Total Salary: 26700
Post: HR
Employee id: 4567
Ví dụ 2:
// Chương trình Go minh họa
// khái niệm của phương thức được khuyến nghị
package main
import "fmt"
// Cấu trúc
type details struct {
// Các trường của
// cấu trúc chi tiết
name string
age int
gender string
psalary int
}
// Phương thức 1
func (e employee) promotmethod(tarticle int) int {
return e.particle * tarticle
}
// Cấu trúc lồng nhau
type employee struct {
post string
particle int
eid int
details
}
// Phương thức 2
func (d details) promotmethod(tsalary int) int {
return d.psalary * tsalary
}
// Phương thức chính
func main() {
// Khởi tạo các trường của
// cơ cấu nhân viên
values := employee{
post: "HR",
eid: 4567,
particle: 5,
details: details{
name: "Sumit",
age: 28,
gender: "Male",
psalary: 890,
},
}
// Các trường được khuyến nghị
// cơ cấu nhân viên
fmt.Println("Name: ", values.name)
fmt.Println("Age: ", values.age)
fmt.Println("Gender: ", values.gender)
fmt.Println("Per day salary: ", values.psalary)
// Phương thức được khuyến nghị
// cơ cấu nhân viên
fmt.Println("Total Salary: ", values.details.promotmethod(30))
// Các trường bình thường của
// cơ cấu nhân viên
fmt.Println("Post: ", values.post)
fmt.Println("Employee id: ", values.eid)
fmt.Println("Total Articles: ", values.promotmethod(30))
}
Kết quả:
Name: Sumit
Age: 28
Gender: Male
Per day salary: 890
Total Salary: 150
Post: HR
Employee id: 4567
Total Articles: 150