Go语言方法的 值接受者 和 指针接受者 的区别

Wesley13
• 阅读 455

首先说下结论

1. 无论方法的接受者是值接受者还是指针接受者,对象值调用该方法和对象指针调用该方法都是可行的。

2. 当方法接受者为指针接受者时,对象的值调用该方法和指针调用该方法都会操作对象本身。

3. 当方法接受者为值接受者时,对象的值调用该方法和指针调用该方法都会操作对象的副本,对对象本身无影响

package method

import "fmt"

type student struct {
    name string
    age  int8
}

func (student student) getName() string {
    student.name = "jack"
    return student.name
}

// 接受者为指针的方法
//func (student *student) getName() string {
//    student.name = "jack"
//    return student.name
//}

func (student student) getAge() int8 {
    student.age = 22
    return student.age
}

// 接受者为指针的方法
//func (student *student) getAge() int8 {
//    student.age = 22
//    return student.age
//}

func TestMethod() {
    s := student{name: "tom", age: 11}

    // 值调用方法
    //fmt.Println("age: ", s.getAge())
    //fmt.Println("name: ", s.getName())

    // 指针调用方法
    fmt.Println("age: ", (&s).getAge())
    fmt.Println("name: ", (&s).getName())

    // 查看调用方法后,对象本身的影响
    fmt.Println(s.age)
    fmt.Println(s.name)
    fmt.Println((&s).age)
    fmt.Println((&s).name)
}
点赞
收藏
评论区
推荐文章
Karen110 Karen110
2年前
一篇文章带你了解JavaScript Object 对象
一、概念JavaScript原生提供Object对象(注意起首的O是大写),介绍该对象原生的各种方法。JavaScript的所有其他对象都继承自Object对象,即那些对象都是Object的实例。二、Object()Object本身是一个函数,可以当作工具方法使用,将任意值转为对象。这个方法常用于保证某个值一定是对象。如果参数为空(或者为undefi
待兔 待兔
3年前
Java多态实现原理
Java多态概述多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevirtual)和接口引用调用(invokeinterface)的实现则有所不同。类引用调用的大致过程为:Java编译器将Java源代码编译成c
Wesley13 Wesley13
2年前
Java线程的6种状态及切换(透彻讲解)
Java中线程的状态分为6种。1\.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2\.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的
Wesley13 Wesley13
2年前
Java高并发编程四
_做个笔记,java线程常用的方法,耐心看完._编号方法说明1publicvoidstart()使该线程开始执行;Java虚拟机调用该线程的run方法。2publicvoidrun()如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,该方
Wesley13 Wesley13
2年前
OC对象本质
ObjectiveC中对象分三类实例对象instance通过alloc产生PersonpNSObjectPersoninit;instance对象内存中存储信息其他成员变量isa指针调用copy方法,遵循NSCopying具体看copyWithZone方法怎么实现
Wesley13 Wesley13
2年前
C++基类的析构函数定义为虚函数的原因
1:每个析构函数只会清理自己的成员(成员函数前没有virtual)。2:可能是基类的指针指向派生类的对象,当析构一个指向派生类的成员的基类指针,这时程序不知道这么办,可能会造成内存的泄露,因此此时基类的析构函数要定义为虚函数;基类指针可以指向派生类的对象(多态),如果删除该指针delete\\p,就会调用该指针指向的派生类的析构函数,而派生类
Wesley13 Wesley13
2年前
Object
nil用来给对象赋值NULL则给任何指针赋值    //NULL和nil不能互换,nil用于类指针赋值NSNull则用于集合操作一般情况下最好使用用nil(空对象值,有意义)\nil 任意方法\,不会导致崩溃NULL是一个通用指针(泛型指针,指向空指针)NSNull,NULL和nil在本质上应该
Wesley13 Wesley13
2年前
Java 对象的哈希值是每次 hashCode() 方法调用重计算么?
对于没有覆盖hashCode()方法的对象如果没有覆盖hashCode()方法,那么哈希值为底层JDKC源码实现,实例每次调用hashcode()方法,只有第一次计算哈希值,之后哈希值会存储在对象头的标记字(MarkWord)中。!image(https
Wesley13 Wesley13
2年前
Java面试中的值传递与引用传递
一、前言Java是值传递的,对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。对于对象型变量而言的,传递的是该对象地址的一个副本,,并不是原对象本身,这里也有人说是引用传递。由于副本的地址和原对象地址一致,因此对副本的值进行操作时,会同步改变原对象值。_但是一旦副本的地址被改变,副本的值的操作则不会影响原对象地址。(
Wesley13 Wesley13
2年前
C# 代理用法
delegate到底是什么东西C语言总学过吧,如果你学得不像我那么差的话,函数指针总用过吧,就算没用过总听说过吧,嗯,大胆的告诉你,你完全可以把delegate理解成C中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作参数传递。不过delegate和函数指针还是有点区别的,dele