Methods in Golang are like functions but with one key difference: they have a receiver argument , which gives access to the properties of the receiver . The receiver can be a struct or a non-struct type, but both must be in the same package. Methods cannot be created for types defined in other packages, including built-in types like int or string ; otherwise, the compiler will throw an error.

For example:
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()
}
Result:
Name: a
Age: 25
Syntax
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
Receiver: Can be accessed using this method.
Method with Receiver of struct type
In Go, you can define a method where the receiver is of type struct. The receiver is accessible inside the method. The previous example illustrates this approach with Receiver of type struct.
Method with Receiver is not struct type
Go also allows methods with non-struct receivers, as long as the receiver type and the method definition are in the same package. You cannot define a method with a receiver type from another package (e.g. int, string).
For example:
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)
}
Result:
Square of 4 is 16
Method with receiver pointer
In Go, methods can have pointer receivers. This allows changes made in the method to be reflected in the caller, which is not possible with value receivers.
Syntax:
func (p *Type) method_name(...Type) Type { // Code}
For example:
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)
}
Result:
Before: a
After: b
Method accepts both pointer and value
Unlike functions, Go methods can accept both value and pointer receivers. You can pass either a pointer or a value and the method will handle it accordingly.
For example:
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()
}
Result:
After pointer method: b
Name: b
Difference between method and function
| Method |
Jaw |
| Contains a receiver |
Does not contain receiver |
| It is possible to define methods with the same name but different types. |
Functions with the same name but different types are not allowed. |
| Cannot be used as a superlative |
Can be used as superordinate objects |