【go语言基础】go中的方法

先思考一个问题,什么是方法,什么是函数?

方法是从属于某个结构体或者非结构体的。在func这个关键字和方法名中间加了一个特殊的接收器类型,这个接收器可以是结构体类型的或者是非结构体类型的。从属的结构体获取该方法。

函数则没有这种从属关系。

func (t Type) methodName(parameter list) {
}
type Teacher struct {
	name     string
	salary   int
	currency string
}

// 在结构体类型上,创建一个方法并调用。
func (tea Teacher) testSalary() {
	fmt.Printf("Salary of %s is %d %s", tea.name, tea.salary, tea.currency)
}

func testUpFun() {
	tea:= Teacher{
		name:     "malou",
		salary:   10666,
		currency: "元",
	}
	tea.testSalary()
}
相同的名字的方法可以定义在不同的类型上,而相同名字的函数是不允许的
// Rectangle 定义Rectangle结构体
type Rectangle struct {
	length int
	width  int
}

// Circle 定义Circle 结构体
type Circle struct {
	radius float64
}

func (rectangle Rectangle) Area() int {
	return rectangle.width * rectangle.length
}

func (circle Circle) Area() float64 {
	return math.Pi * circle.radius * circle.radius
}

func testArea() {
	r := Rectangle{
		width:  10,
		length: 20,
	}
	fmt.Printf("Area is %d\n", r.Area())
	c := Circle{
		radius: 12,
	}
	fmt.Printf("Area is %f\n", c.Area())
}
值接收器和指针接收器之间的区别在于,在指针接收器的方法内部的改变对于调用者是可见的,然而值接收器的情况不是这样的。
// Dog struct
type Dog struct {
	name string
	age  int
}

// 使用值接收器的方法
func (d Dog) changeDogName(newName string) {
	d.name = newName
}

// 使用指针接收器的方法
func (d *Dog) changeAge(newAge int) {
	d.age = newAge
}

func testPointerStruct() {
	d := Dog{
		name: "金mao",
		age:  22,
	}
	// 并没有改变实际的值,只是改变的变量的副本
	fmt.Printf("before change is %s\n", d.name)
	d.changeDogName("马犬")
	fmt.Printf("after change is %s\n", d.name)

	// 改变的是变量本身的值
	fmt.Printf("before change is %d\n", d.age)
	d.changeAge(11)
	fmt.Printf("after change is %d\n", d.age)
}
那什么时候使用指针接收器,什么时候使用值接收器?

   指针接收器可以使用在:对方法内部的接收器所做的改变应该对调用者可见时。
   当拷贝一个结构体的代价过于昂贵的时候,比如说结构体中有很多字段,如果方法内使用
   这个结构体做为值接收器需要拷贝整个结构体,这个代价十分昂贵,这种情况下使用指针接收器,结构体不会被拷贝,只会传递一个指针到方法的内部。
   在其他的所有情况,值接收器都可以被使用。

在方法中使用值接收器 和 在函数中使用值参数:
type rectangle struct {
	width  int
	length int
}
// 函数中的参数,值类型,只能传递一个值类型
func area(r rectangle) {
	fmt.Printf("Area Function result :%d\n", r.length*r.width)
}

func (r rectangle) area() {
	fmt.Printf("Area Method result :%d\n", r.length*r.width)
}

func testFunAndMethod() {
	r := rectangle{
		width:  10,
		length: 15,
	}
	area(r)
	r.area()
	p := &r
	// (*p).area(),go解释器会自动的解引用
	p.area()
}

// 在方法中使用指针,和在函数中使用指针参数
func (r *rectangle) perimeter() {
	fmt.Printf("Area Method result is %d\n", r.width*r.length)
}

func perimeter(r *rectangle) {
	fmt.Printf("Area Function result is %d\n", r.width*r.length)
}

func testPointerStruct1() {
	r := rectangle{
		width:  12,
		length: 10,
	}
	p := &r
	perimeter(p)
	p.perimeter()

	// r.perimeter() 解释为 (&r).perimeter()  还有一种是(*p).name  相互解引用,从指针p->(*p),从值r到指针(&r)
	r.perimeter()
}

小结:

大多数方法都使用的是结构体从属,注意传递的是值传递还是指针传递。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/68980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go重制版的海盗王gateserver网关服务端

海盗王原有的gateserver网关经常出现无故报错和掉地图的问题,经过反复修改都无法解决相关问题。 加上,原有的程序已经趋于古董级别,存在很大的兼容性问题。 以上,萌发了用go语言进行重新开发一个gateserver网关程序的想法&#xf…

sxs卡丢失数据如何找回?sxs卡数据丢失原因和修复办法分享!

说起sxs卡,你们是否有所了解呢?sxs卡具有很好的传输性能,能够存储照片和视频数据,主要被放置在索尼XDCAM EX型摄像机上。 而在使用sxs卡设备过程中,难免和其他设备一样,容易出现数据丢失情况。而如果丢失的…

ESP-IDF插件去除红色波浪线

如图,新装的ESP-IDF打开别人的工程有好多红色波浪线。 把这里的第一个文件夹删除,就是那个.vscode,接下来按ctrlshiftP,输入vscode, 选第一个,添加配置文件夹。 问题解决。 之后记得重新配置板子信息和串…

豪越HYDO智能运维助力智慧医院信息化建设

随着国家政策的推动与支持,医疗行业信息化应用不断普及,大数据、AI、医疗物联网等技术的应用,快速推动了电子病历、智慧服务、智慧管理的智慧医院建设和医院信息标准化建设,通过不断探索创新“智慧医院”服务模式,实现…

Java实现籍贯级联选择器

在工作中要求写一个籍贯的级联选择器,记录一下自己写这个级联选择器的过程,因为自己才刚开始工作,有很多地方都没有考虑的很清楚,希望各位大佬能给出建议。 一、需求 A:正常的23个省,籍贯由“省区/县/市”组成&#xf…

回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门…

Linux下 时间戳的转化

Linux下一般用date 记录当前时间,尤其是我们需要保存测试log的时候,或者设计一个跑多长时间的脚本都需要时间戳。下面看一下平时最常用的几种写法 1 date “%Y-%m-%d %H:%M” 显示具体时间 2 修改时间 date -s 3 date %s :当前时间的时间戳 显示具体时…

pycharm,VSCode 几个好用的插件

pycharm Tabnine AI Code 可以在编写程序的时候为你提供一些快捷方式,增加编程速度 Chinese 对英文不好的程序员来说是个不错的选择,可以将英文状态下的pycharm变为中文版的 ChatGPT 可以跟ai聊天,ai可以解决你80%的问题 ,也可以帮…

机器学习笔记 - 基于C++的​​深度学习 二、实现卷积运算

一、卷积 卷积是信号处理领域的老朋友。最初的定义如下 在机器学习术语中: I(…)通常称为输入 K(…)作为内核,并且 F(…)作为给定K的I(x)的特征图。 虑多维离散域,我们可以将积分转换为以下求和 对于二维数字图像,我们可以将其重写为: <

鸿蒙开发学习笔记1——真机运行hello world

问题背景 学习任何语言和框架的第一步&#xff0c;永远都是跑通熟悉的“hello world”&#xff0c;本文将介绍鸿蒙开发如何跑通“hello world”。 问题分析 一、构建第一个ArkTS应用&#xff08;fa模型&#xff09; 说明&#xff1a;请使用DevEco Studio V3.0.0.601 Beta1及…

企业分配给员工的微信号怎么高效管理?

很多很多公司都在发愁这几个问题&#xff1a; 1、拥有多个微信号&#xff0c;不想管理多台手机&#xff0c;想将所有微信号进行统一管理 2、想用软件来代替传统的营销体系&#xff0c;安全性上也要有保障 3、用人成本太大与公司的效益不成正比 4、多个账号发圈不方便&#xff0…

电脑连接安卓设备显示offline

The Android is offline. This can be resolved by physically disconnecting and...用USB线连接手机和电脑&#xff0c;打开cmd&#xff0c;输入adb devices -l, adb devices -l结果显示可以识别手机&#xff0c;但是状态为offline 打开另外一个终端&#xff0c;输入 adb k…

BGP基础实验建邻+宣告实验

实验题目如下&#xff1a; 实验拓扑如下&#xff1a; 实验要求如下&#xff1a; 【1】除R5的5.5.5.0环回外&#xff0c;其他所有的环回均可互相访问 实验思路如下&#xff1a; &#xff08;1&#xff09;合理的IP配置 &#xff08;2&#xff09;合理的BGP配置 &#xff08;…

每日一题——滑动窗口的最大值

滑动窗口的最大值 题目链接 暴力解法 最容易想到的当然还是通过两层循环来暴力求解&#xff1a;一层循环用来移动窗口&#xff0c;一层循环用来在窗口内找到最大值。这种做法的时间复杂度为O(kN)&#xff0c;会超出时间限制&#xff0c;因此&#xff0c;我们要找到更加高效的…

UX与UI设计的区别是什么?看这一篇就够了!

在产品开发和用户体验设计领域&#xff0c;UX&#xff08;用户体验&#xff09;与UI&#xff08;用户界面&#xff09;设计是两个常被提及的概念&#xff0c;其本质都是在解决产品的用户问题&#xff0c;但在实际的工作场景中&#xff0c;它们代表着不同的设计方向与职责。 简…

自举电容的工作原理

一&#xff0e;异步自举 1.1异步Buck的自举环路组成 上图为芯片的典型应用拓扑&#xff0c;Cboot就是我们说的自举电容。为了能清楚的理解自举电容的原理&#xff0c;我们需要深入到Buck芯片内部&#xff0c;去看个究竟。 上图即为异步Buck芯片LMR16006的内部架构。 ①Q1&…

Git入门到精通——保姆级教程(涵盖GitHub、Gitee、GitLab)

文章目录 前言一、Git1.Git-概述1.1.Git-概述-版本控制介绍1.2.Git-概述-分布式版本控制VS集中式版本控制1.3.Git-概述-代码托管中心1.4.Git-概述-安装和客户端的使用 2.Git-命令(常用命令)2.1.Git-命令-设置用户签名2.2.Git-命令-初始化本地库2.3.Git-命令-查看本地库状态2.4.…

机器学习---梯度下降代码

1. 归一化 # Read data from csv pga pd.read_csv("pga.csv") print(type(pga))print(pga.head())# Normalize the data 归一化值 (x - mean) / (std) pga.distance (pga.distance - pga.distance.mean()) / pga.distance.std() pga.accuracy (pga.accuracy - pg…

数据库新闻速递 -- POSTGRESQL 正在蚕食数据库市场 (翻译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &#xff0c;在新加的朋友会分到3群&#xff…

C语言----输入scanf和输出printf详解

C语言编程中&#xff0c;输入输出是基本操作&#xff0c;printf和scanf并不是C语言中的唯一的输入输出选择&#xff0c;对于输入有scanf()、getchar()、getche()、getch()、gets()&#xff1b;对于输出有printf()、puts()、putchar()&#xff0c;他们各有自己的使用场景&#x…