首页 > 其他分享 >go值接收者和指针接收者的区别

go值接收者和指针接收者的区别

时间:2022-12-26 14:55:14浏览次数:45  
标签:调用 Name fmt 接收者 类型 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() // 指针接收者只能用实现了接口的指针类型调用

}

总结

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

标签:调用,Name,fmt,接收者,类型,go,指针
From: https://www.cnblogs.com/weiweivip666/p/17005808.html

相关文章

  • Django:auth认证模块
    目录一、django的auth认证模块1.什么是auth模块2.生成auth物理表二、创建django-admin账户1.创建超级管理员2.注册超级管理员账户3.登录admin账户三、auth模块中的方法1.导......
  • django中间件
    django中间件django默认有七个中间件并且还支持用户自定义中间件中间件主要可以用于:网站访问频率的校验用户权限的校验等全局类型的功能需求MIDDLEWARE=['......
  • 适用场景全新升级!扩展 Dragonfly2 作为分布式缓存系统架构 | 龙蜥技术
    文/龙蜥社区开发者 Dragonfly2简介Dragonfly作为​​龙蜥社区的镜像加速标准解决方案​​,是一款基于P2P的智能镜像和文件分发工具。它旨在提高大规模......
  • PPT 商务报告,如何去表现客户LOGO
    PPT商务报告,如何去表现客户LOGOLOGO如何下载LOGO如何展示矩阵排列删除背景,变成白色删除背景设置透明度AI软件做成矢量图LOGO转色法......
  • mongodb shell设置
    [root@host-172-16-13-179~]#cat/root/.mongorc.jshost=db.serverStatus().host;cmdCount=1;prompt=function(){returndb+"@"+host+""+(cmdCount++)+">";}func......
  • 使用 Google Cloud Pub/Sub 发送消息
    本指南将引导您完成在程序的不同部分或不同程序之间交换消息的过程,使用弹簧集成通道适配器和谷歌云发布/订阅作为底层消息交换机制。您将构建的内容一个弹簧启动向自身发送......
  • MongoDB - 模式设计
    注意事项模式设计,即在文档中表示数据的方式,对于数据表示来说时非常关键的。为MongoDB做模式设计时,在性能、可伸缩性和简单性方面是重中之重,也需要考虑一些特别的注意事......
  • 周而复始,往复循环,递归、尾递归算法与无限极层级结构的探究和使用(Golang1.18)
    所有人都听过这样一个歌谣:从前有座山,山里有座庙,庙里有个和尚在讲故事:从前有座山。。。。,虽然这个歌谣并没有一个递归边界条件跳出循环,但无疑地,这是递归算法最朴素的落地实......
  • Djiango:csrf跨站请求伪造
    目录一、csrf跨站请求伪造1.csrf简介2.模拟钓鱼网站案例二、csrf相关校验策略1.form的csrf策略2.ajax请求csrf策略三、csrf相关视图验证1.FBV添加csrf校验装饰器2.CBV添加c......
  • Mongo
    MongodbConfpackagecom.citi.conf;importjava.io.Serializable;publicclassMongodbConfimplementsSerializable{privatestaticfinallongserialVersio......