go值接收者和指针接收者的区别
方法的接收者
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值接收者和指针接收者的区别的更多相关文章
- golang指针接收者和值接收者方法调用笔记
初学go时很多同学会把 值接收者 和 指针接收者 的方法相互调用搞混淆,好多同学都只记得指针类型可以调用值接收者方法和指针接收者方法,而值类型只能调用值接收者方法,其实不然,在某些情况下,值类型也是可 ...
- Go指南_指针接收者
源地址 https://tour.go-zh.org/methods/4 一.描述 你可以为指针接收者声明方法. 这意味着对于某类型 T,接收者的类型可以用 *T 的文法.(此外,T 不能是像 *in ...
- c++值传递,指针传递,引用传递以及指针与引用的区别
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...
- 【转载】C++ 值传递、指针传递、引用传递详解
原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...
- C++ 值传递、指针传递、引用传递详解
C++ 值传递.指针传递.引用传递详解 最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式” 数组和指针背后——内存角度 语义"陷阱&quo ...
- C++中引用传递与指针传递的区别
最近Garena面试的过程中,面试官提了一个问题,C++中引用传递和指针传递的区别? 根据自己的经验,联想到了swap函数,只知道既可以用引用来实现,又可以用指针传递来实现,至于二者有何区别,自己还真 ...
- 【转】C++ 值传递、指针传递、引用传递详解
而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~ 下文会通过例子详细说明哦 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角 ...
- iOS开发_内存泄漏、内存溢出和野指针之间的区别
今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正. 内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自 ...
- PHP值传递和引用传递的区别
PHP值传递和引用传递的区别.什么时候传值什么时候传引用 (1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略 (2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 (3)优 ...
- C++中值传递、指针传递、引用传递的总结
C++中值传递.指针传递.引用传递的总结 指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者.对比值传递,指针/引用传递可以将改变由形参"传给"实参(实际上就 ...
随机推荐
- [转帖]【性能】中断绑定和查看|irqbalance 中断负载均衡|CPU瓶颈
常用命令 ``` # 查看当前运行情况 service irqbalance status # 终止服务 service irqbalance stop 取消开机启动: chkconfig irqba ...
- 【转帖】通过pip命令安装好包之后,在pycharm中不显示此库,也不能调用
目录 1. 问题描述 2. 解决方法1 3. 解决方法2 1. 问题描述 在cmd输入pip list 命令可以看到我的库都已经安装好了,但是pycharm中却没有显示. 在PyCharm查找,并没有 ...
- [转帖]将 Cloudflare 连接到互联网的代理——Pingora 的构建方式
https://zhuanlan.zhihu.com/p/575228941 简介 今天,我们很高兴有机会在此介绍 Pingora,这是我们使用 Rust 在内部构建的新 HTTP 代理,它每天处理超 ...
- [转帖]ElasticSearch 最全详细使用教程
https://zhuanlan.zhihu.com/p/449555826?utm_source=weibo&utm_medium=social&utm_oi=27124941455 ...
- Linux 界面能够出现ip地址提示的方法
cat <<EOF >/etc/profile.d/ip.sh if [[ `tty | grep "pts"` ]]; then export PS1='['& ...
- vue 进阶学习(二):node.js、npm、webpack、vue-cli
node.js.npm.webpack.vue-cli 前言:主要对插件的描述,安装,卸载.使用以及注意点 1 node.js 说明:是一个基于 Chrome V8 引擎的 JavaScript 运行 ...
- 小白学k8s(3)什么是内网穿透
什么是内网穿透 内网穿透 工作方式 通信的一方处于内网 通信的双方都处于内网 NAT穿透的原理 UDP内网穿透的实现流程 参考 什么是内网穿透 内网穿透 什么是内网穿透呢? 百度百科的描述 内网穿透, ...
- 【二】gym初次入门一学就会---代码详细解析简明教程----平衡杆案例
相关文章: [一]gym环境安装以及安装遇到的错误解决 [二]gym初次入门一学就会-简明教程 [三]gym简单画图 [四]gym搭建自己的环境,全网最详细版本,3分钟你就学会了! [五]gym搭建自 ...
- 多路io复用Select [补档-2023-07-16]
select 2.1 简介 select函数可以用于实现高效的多路复用 I/O,同时处理多个文件描述符的事件,包括监听可读.可写和异常条件,具有阻塞和非阻塞模式,并可以设置超时时间.这使得程序能够 ...
- 9.文件和异常--《Python编程:从入门到实践》
9.1 从文件中读取数据 要使用文本文件中的信息,首先需要将信息读取到内存中.为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取. 9.1.1 读取整个文件 with open( ...