方法的接收者

package main

import (
"fmt"
) type Person struct {
Name string
Age int
} func (p Person) walking(){
fmt.Println("我是值类型方法")
fmt.Printf("%s, 今年%d, 正在跑步\n", p.Name, p.Age)
} func (p *Person) swimming(){
fmt.Println("我是指针类型方法")
fmt.Printf("%s, 今年%d, 正在游泳\n", p.Name, p.Age)
} func main(){
// 值类型既可以调用值接收者的方法也可以调用指针接收者的方法
p := Person{
Name: "lucy",
Age: 25,
}
p.walking() p.swimming() // 指针类型既可以调用值接收者的方法也可以调用指针接收者的方法
p1 := Person{
Name: "Mike",
Age: 21,
}
p1.walking() p1.swimming()
}

接口的实现,值类型接收者和指针接收者

package main

import (
"fmt"
) type Action interface {
walking()
} type Action1 interface{
swimming()
} type Person struct {
Name string
Age int
} func (p Person) walking(){
fmt.Println("我是接口值类型方法,可以值类型调用也可以指针类型调用")
fmt.Printf("%s, 今年%d, 正在跑步\n", p.Name, p.Age)
} func (p *Person) swimming(){
fmt.Println("我是接口指针类型方法,只能指针类型调用")
fmt.Printf("%s, 今年%d, 正在游泳\n", p.Name, p.Age)
} func main(){
var action Action
// 值类型实现了接口的,指针类型和值类型都可以调用值类型的方法
p := Person{
Name: "lucy",
Age: 25,
}
// action = p
// action.walking() action = &p
action.walking() // 指针类型实现了接口,只能指针类型可以调用指针类型的方法
var action1 Action1
p1 := Person{
Name: "Mike",
Age: 22,
}
// action1 = p1
// action1.swimming() // 指针接收者不能用实现了接口的值类型调用,会报错 action1 = &p1
action1.swimming() // 指针接收者只能用实现了接口的指针类型调用 }

总结

方法接收者:
- 值类型,既可以调用值接收者的方法,也可以调用指针接收者的方法
- 指针类型,既可以调用指针接收者的方法,也可以调用值接收者的方法
但是接口的实现,值类型接收者和指针类型接收者不一样:
- 以值类型接收者实现接口,类型本身和该类型的指针类型,都实现了该接口
- 以指针类型接收者实现接口,只有对应的指针类型才被认为实现了接口
通常我们使用指针作为方法的接收者的利益:
- 使用指针方法能够修改接收者指向的值
- 可以避免在每次调用方法时复制该值,在值的类型为大型结构体时,这样做会更加高效

go值接收者和指针接收者的区别的更多相关文章

  1. golang指针接收者和值接收者方法调用笔记

    初学go时很多同学会把 值接收者 和 指针接收者 的方法相互调用搞混淆,好多同学都只记得指针类型可以调用值接收者方法和指针接收者方法,而值类型只能调用值接收者方法,其实不然,在某些情况下,值类型也是可 ...

  2. Go指南_指针接收者

    源地址 https://tour.go-zh.org/methods/4 一.描述 你可以为指针接收者声明方法. 这意味着对于某类型 T,接收者的类型可以用 *T 的文法.(此外,T 不能是像 *in ...

  3. c++值传递,指针传递,引用传递以及指针与引用的区别

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...

  4. 【转载】C++ 值传递、指针传递、引用传递详解

    原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...

  5. C++ 值传递、指针传递、引用传递详解

    C++ 值传递.指针传递.引用传递详解 最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式” 数组和指针背后——内存角度 语义"陷阱&quo ...

  6. C++中引用传递与指针传递的区别

    最近Garena面试的过程中,面试官提了一个问题,C++中引用传递和指针传递的区别? 根据自己的经验,联想到了swap函数,只知道既可以用引用来实现,又可以用指针传递来实现,至于二者有何区别,自己还真 ...

  7. 【转】C++ 值传递、指针传递、引用传递详解

    而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~ 下文会通过例子详细说明哦 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角 ...

  8. iOS开发_内存泄漏、内存溢出和野指针之间的区别

    今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正. 内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自 ...

  9. PHP值传递和引用传递的区别

    PHP值传递和引用传递的区别.什么时候传值什么时候传引用 (1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略 (2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 (3)优 ...

  10. C++中值传递、指针传递、引用传递的总结

    C++中值传递.指针传递.引用传递的总结   指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者.对比值传递,指针/引用传递可以将改变由形参"传给"实参(实际上就 ...

随机推荐

  1. 【转帖】32.MinorGC、MajorGC和FullGC的对比

    目录 1.MinorGC.MajorGC和FullGC的对比 2.GC触发机制 1.MinorGC.MajorGC和FullGC的对比 1.JVM在进行GC的时候,并不是每次都是对新生代.老年代.永久 ...

  2. Python学习之十八_获取神通数据库所有的表数据量

    Python学习之十八_获取神通数据库所有的表数据量 背景 今天想获取一下所有数据库的表信息.但是发现神通数据库的系统表里面的表信息不正确 无法获取实际意义的表信息. 联系了下神通数据库的原厂高手. ...

  3. [转帖]Nginx-https证书认证详解

    https://developer.aliyun.com/article/885650?spm=a2c6h.24874632.expert-profile.306.7c46cfe9h5DxWK 简介: ...

  4. [转帖]Elasticsearch-sql 用SQL查询Elasticsearch

    https://www.cnblogs.com/kangoroo/p/7273493.html https://www.cnblogs.com/kangoroo/p/7273493.html Elas ...

  5. JRC Flink流作业调优指南

    # 作者:京东物流 康琪 本文综合Apache Flink原理与京东实时计算平台(JRC)的背景,详细讲述了大规模Flink流作业的调优方法.通过阅读本文,读者可了解Flink流作业的通用调优措施,并 ...

  6. 缩小ios的包体

    不选全部兼容设备 在xcode中导出ipa时,不勾选导出全部兼容性设备,这样导出的ipa包含两种架构:armv7和64 打包压缩 unity提供三种压缩模式可以选择,默认选择的是:default不压缩 ...

  7. 从零开始配置 vim(9)——初始配置

    虽然本系列文章叫做从0开始配置vim,似乎我们从一开始就要写vimrc配置文件,但是我们并没有这么做.我们先经过几篇文章了解了下面的几个内容 如何设置vim属性,从而改变vim的特征 配置快捷键,以提 ...

  8. vim 从嫌弃到依赖(4)—— .命令

    通过之前几篇文章的介绍,如果各位小伙伴能够勤加练习,并在日常工作上经常使用,那么相信那些内容已经会对工作效率的提升产生好的影响.但是如果那些就是vim的全部的话,我们也就没那么大的必要花这么大的精力来 ...

  9. SqlSugar多库/多租户

    1. 多库和多租户 如果是接口ISugarClient先看一下标题6,看完在看这儿 1.1 固定多数据库模式 数据库数量是固定的一般在声明的全部加上 //通过ConfigId进行数据库区分 var d ...

  10. 驱动开发:内核读取SSDT表基址

    在前面的章节<X86驱动:挂接SSDT内核钩子>我们通过代码的方式直接读取 KeServiceDescriptorTable 这个被导出的表结构从而可以直接读取到SSDT表的基址,而在Wi ...