1111111111111 值接收者方法和指针接收者方法

 在Go语言中方法就是定义了接受者的函数,方法和函数只差了一个参数,那就是方法在 func 和标识符之间多了一个参数。接受者定义在func关键字和函数名之间:

type Person struct {
    name string
    age int
}
 
func (p Person) say() {
    fmt.Printf("I'm %s,%d years old\n",p.name,p.age)
}

接收者有两种,一种是值接收者,一种是指针接收者。顾名思义,值接收者,是接收者的类型是一个值,是一个副本,方法内部无法对其真正的接收者做更改;指针接收者,接收者的类型是一个指针,是接收者的引用,对这个引用的修改之间影响真正的接收者。

代码一:(值接收者方法)

package main
 
import "fmt"
 
type Person struct {
   name string
   age int
}
func (p Person) say() {
   fmt.Printf("I'm %s,%d years old\n",p.name,p.age)
}
func (p Person) older(){
   p.age = p.age +1
}
func main() {
   var p1 Person = Person{"zhansan",16}
   p1.older()
   p1.say()
   //output: I'm zhangsan,16 years old
   var p2 *Person = &Person{"lisi",17}
   p2.older()
   p2.say()
   //output: I'm lisi,17 years old
}

输出:(指针接收者方法)

I'm zhansan,16 years old
I'm lisi,17 years old

代码二:

package main
 
import "fmt"
 
type Person struct {
    name string
    age int
}
func (p Person) say() {
    fmt.Printf("I'm %s,%d years old\n",p.name,p.age)
}
func (p *Person) older(){
    p.age = p.age +1
}
func main() {
    var p1 Person = Person{"zhansan",16}
    p1.older()
    p1.say()
    //output: I'm zhangsan,17 years old
    var p2 *Person = &Person{"lisi",17}
    p2.older()
    p2.say()
    //output: I'm lisi,18 years old
}
I'm zhansan,17 years old
I'm lisi,18 years old

 区别:

如果方法的接收者是指针类型,无论调用者是对象还是对象指针,修改的都是对象本身,会影响调用者;(即函数内的修改会影响到外面的调用者)

如果方法的接收者是值类型,无论调用者是对象还是对象指针,修改的都是对象的副本,不影响调用者。(即函数内的修改不会影响到外面的调用者)

两者分别在何时使用

如果方法的接收者是值类型,无论调用者是对象还是对象指针,修改的都是对象的副本,不影响调用者;如果方法的接收者是指针类型,则调用者修改的是指针指向的对象本身。

使用指针作为方法的接收者的理由:

1)方法能够修改接收者指向的值。

2)避免在每次调用方法时复制该值,在值的类型为大型结构体时,这样做会更加高效。

是使用值接收者还是指针接收者,不是由该方法是否修改了调用者(也就是接收者)来决定,而是应该基于该类型的本质。

如果类型具备“原始的本质”,也就是说它的成员都是由 Go 语言里内置的原始类型,如字符串,整型值等,那就定义值接收者类型的方法。像内置的引用类型,如 slice,map,interface,channel,这些类型比较特殊,声明他们的时候,实际上是创建了一个 header, 对于他们也是直接定义值接收者类型的方法。这样,调用函数时,是直接 copy 了这些类型的 header,而 header 本身就是为复制设计的。

如果类型具备非原始的本质,不能被安全地复制,这种类型总是应该被共享,那就定义指针接收者的方法。比如 go 源码里的文件结构体(struct File)就不应该被复制,应该只有一份实体。

image

image

 

https://blog.csdn.net/zy_dreamer/article/details/132795614?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-12-132795614-blog-121100211.235^v40^pc_relevant_3m_sort_dl_base4&spm=1001.2101.3001.4242.7&utm_relevant_index=15

 

https://blog.csdn.net/qq_31967569/article/details/120255470?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170495956116800182726037%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170495956116800182726037&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-120255470-null-null.142^v99^pc_search_result_base1&utm_term=go%20%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B%E6%8E%A5%E6%94%B6%E8%80%85&spm=1018.2226.3001.4187

 

 

https://blog.csdn.net/weixin_42128977/article/details/126511071?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170495956116800182726037%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170495956116800182726037&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-126511071-null-null.142^v99^pc_search_result_base1&utm_term=go%20%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B%E6%8E%A5%E6%94%B6%E8%80%85&spm=1018.2226.3001.4187

posted @ 2024-01-12 22:41  李若盛开  阅读(2)  评论(0)    收藏  举报