方法的接收者

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. [转帖]Python模块winRM

    https://www.jianshu.com/p/ac095497bad4 一.介绍 winRM服务是windows server下PowerShell的远程管理服务.Python脚本通过连接win ...

  2. 行云部署成长之路--慢SQL优化之旅 | 京东云技术团队

    ​ 当项目的SQL查询慢得像蜗牛爬行时,用户的耐心也在一点点被消耗,作为研发,我们可不想看到这样的事.这篇文章将结合行云部署项目的实践经验,带你走进SQL优化的奇妙世界,一起探索如何让那些龟速的查询飞 ...

  3. 数组查询includes

    let arr1 = ['kk', 'jo', 'll']; if (arr1.includes("kk")) {//[ɪnˈkluːz] console.log("找到 ...

  4. 【分享代码片段】terraform中,如何从刚刚创建的 deployment 中获得所有容器的名字和 ip

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 不好意思,刚刚才开始用 terraform,或许是更好的办 ...

  5. 玩一玩 VictoriaLogs

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 下载 see: https://github.com/Vi ...

  6. 一个思路:实现 golang 中的 `__file__` `__line__` 宏

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 测试 zaplog 发现,开启 caller 的调用,会使 ...

  7. Windows堆管理机制 [1] 堆基础

    声明:这篇文章在写的时候,是最开始学习这个堆管理机制,所以写得有些重复和琐碎,基于笔记的目的想写得全一些,这篇文章写的时候参考了很多前辈的文章,已在末尾标出,某些未提及到的可以在评论补充 基于分享的目 ...

  8. 基于SpringBoot应⽤的logback⽇志配置

    SpringBoot默认整合了logback-classic⽇志框架,我们需要对logback⽇志框架进⾏配置 以⾃定义⽇志输出格式.⽇志⽂件配置.⽇志⽂件保存策略等信息 <?xml versi ...

  9. ubuntu系统单网卡配置多网段IP

    环境 系统版本:Ubuntu 16.04.5 LTS 配置 ubuntu系统网卡文件是interfaces,修改网卡配置文件vim /etc/network/interfaces添加2个IP地址: a ...

  10. [JVM]逃逸分析

    逃逸分析 JVM的内存分配策略 首先回顾一下JVM的内存分配策略. JVM的内存包括方法区.堆.虚拟机栈.本地方法栈.程序计数器.一般情况下JVM运行时的数据都是存在栈和堆上的.栈用来存放一些基本变量 ...