zoukankan      html  css  js  c++  java
  • Go语言值接收者方法和指针接收者方法

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

    type Person struct {
        name string
        age int
    }
    
    func (p Person) say() {
        fmt.Printf("I'm %s,%d years old
    ",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
    ",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
    }

     输出:

    #gosetup
    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
    ",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
    }

    输出:

    #gosetup
    I'm zhansan,17 years old
    I'm lisi,18 years old

    这两段代码唯一的区别就是在older()方法这,第一段代码是值接受者方法,第二段代码是指针接受者方法。

  • 相关阅读:
    .net GC的工作原理
    ISAPI的作用ASP.NET的HTTP请求的处理方法
    进程和线程
    浅论ViewState及其与Session的关系
    堆和栈的区别
    关于system.resources名称空间引用的问题
    多线程和多进程
    HTTP 状态码含义
    WebView 载入本地的html
    Intentfilter的介绍
  • 原文地址:https://www.cnblogs.com/tianyun5115/p/12613036.html
Copyright © 2011-2022 走看看