方法和函数的区别
方法和函数最主要的区别是有无接收者。函数是独立定义的,不属于任何类型。
方法有一个特殊的参数,称为接收者(receiver),它定义了方法所属的类型,不一定是结构体,任何自定义类型都可以为之定义方法。
调用方式:方法通过类型变量或指针进行调用,类似于面向对象编程中的对象的方法调用。函数可以直接通过函数名进行调用。
包外可见性:方法的可见性由接收者的可见性决定。如果是私有的,那么其方法也是私有的。函数的可见性由函数名的可见性决定
重载:函数支持重载,可以同名但是参数列表不一样,方法不行。
方法
代码语言:javascript复制type MyInt int
func (m MyInt) Double() int {
return int(m * 2)
}
func main() {
num := MyInt(5)
doubled := num.Double()
fmt.Println(doubled) // 输出:10
}
函数
代码语言:javascript复制func Double(a int) int {
return a * 2
}
func main() {
result := Double(5)
fmt.Println(result) // 输出:10
}
值接收者(value receiver)和指针接收者
方法可以定义两种类型的接收者:值接收者(value receiver)和指针接收者,使用值接收者和指针接收者的主要区别在于方法对接收者是否会对原始值进行修改
代码语言:javascript复制type Counter struct {
count int
}
func (c Counter) Increment() {
c.count
}
func (c *Counter) Decrement() {
c.count--
}
func main() {
//值接收者
counter1 := Counter{count: 0}
counter1.Increment()
fmt.Println(counter1.count) // 输出0 未改变原始值
//指针接收者
counter2 := &Counter{count: 0}
counter2.Decrement()
fmt.Println(counter2.count) // 输出-1 修改了原始值
}