Home  >  Article  >  Backend Development  >  What is the difference between the receiver of a method in golang being a pointer and not being a pointer?

What is the difference between the receiver of a method in golang being a pointer and not being a pointer?

藏色散人
藏色散人forward
2020-11-18 15:18:392407browse

The following column of golang tutorial will give you a detailed explanation of the difference between the receiver of the method in golang. I hope it is a pointer and not a pointer. Help those in need!

What is the difference between the receiver of a method in golang being a pointer and not being a pointer?

Preface

Recently I read a website and a student asked me what is the difference between the receiver of a method in golang being a pointer and not being a pointer. Here I will make it simple and easy to understand. The method is explained to help students who have just learned golang.

What is the method

In fact, as long as you understand this principle, you can basically understand the problems mentioned above.

Method is actually a special function, receiver is the first parameter passed in implicitly.

For example

type test struct{
    name string
}

func (t test) TestValue() {
}

func (t *test) TestPointer() {
}

func main(){
    t := test{}
    
    m := test.TestValue
    m(t)
    
    m1 := (*test).TestPointer
    m1(&t)    
}

Is it easy to understand? ?Now let’s add the code to see what the difference is between pointers and non-pointers.

type test struct{
    name string
}

func (t test) TestValue() {
    fmt.Printf("%p\n", &t)
}

func (t *test) TestPointer() {
    fmt.Printf("%p\n", t)
}

func main(){
    t := test{}
    //0xc42000e2c0
    fmt.Printf("%p\n", &t)
    
    //0xc42000e2e0
    m := test.TestValue
    m(t)
    
    //0xc42000e2c0
    m1 := (*test).TestPointer
    m1(&t)    

}

I guess some students have already understood that when the actual parameters are not pointers, the value is copied. So every call A copy of a TestValue() value occurs.
What will be the result if it involves the operation of modifying the value?

type test struct{
    name string
}

func (t test) TestValue() {
    fmt.Printf("%s\n",t.name)
}

func (t *test) TestPointer() {
    fmt.Printf("%s\n",t.name)
}

func main(){
    t := test{"wang"}

    //这里发生了复制,不受后面修改的影响
    m := t.TestValue
    
    t.name = "Li"
    m1 := (*test).TestPointer
    //Li
    m1(&t)    
    
    //wang
    m()
}

So all students must pay attention when encountering such problems in programming.
So what is the relationship between these method sets? Here I borrow qyuhen’s reading notes in golang (https://github.com/qyuhen/book). I also recommend friends who like golang to read this book. , which is very helpful for deepening the understanding of golang.

• Type T method set contains all receiver T methods.
• The type T method set contains all receiver T T methods.
• If type S contains anonymous field T, then S method set contains T method.
• If type S contains anonymous field T, then S's method set contains T T methods.
• Regardless of embedding T or T, the set of S methods always contains T *T methods.

Conclusion

Although golang is simple and easy to use, it still has many pitfalls. The author encountered many pitfalls in the process of using golang, which will be mentioned in the blog later. Everyone is welcome. discuss together.

The above is the detailed content of What is the difference between the receiver of a method in golang being a pointer and not being a pointer?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:segmentfault.com. If there is any infringement, please contact admin@php.cn delete