50天精通Golang(第7天)

一、方法

1.1 什么是方法

Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集

方法只是一个函数,它带有一个特殊的接收器类型,它是在func关键字和方法名之间编写的。接收器可以是struct类型或非struct类型。接收方可以在方法内部访问。

方法能给用户自定义的类型添加新的行为。它和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法。接收者可以是值接收者,也可以是指针接收者。

在调用方法的时候,值类型既可以调用值接收者的方法,也可以调用指针接收者的方法;指针类型既可以调用指针接收者的方法,也可以调用值接收者的方法。

也就是说,不管方法的接收者是什么类型,该类型的值和指针都可以调用,不必严格符合接收者的类型。

1.2 方法的语法

定义方法的语法

func (t Type) methodName(parameter list)(return list){
}
func funcName(parameter list)(return list){
}

示例代码:

package mainimport ("fmt"
)type Employee struct {name stringsalary intcurrency string
}
/*
displaySalary() method has Employee as the receiver type
*/func (e Employee) displaySalary() {  fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)
}func main() {  emp1 := Employee {name:     "Sam Adolf",salary:   5000,currency: "$",}emp1.displaySalary() //Calling displaySalary() method of Employee type
}

可以用定义相同的方法名
示例代码:

package mainimport ("fmt""math"
)type Rectangle struct {width, height float64
}
type Circle struct {radius float64
}func (r Rectangle) area() float64 {return r.width * r.height
}
//该 method 属于 Circle 类型对象中的方法
func (c Circle) area() float64 {return c.radius * c.radius * math.Pi
}
func main() {r1 := Rectangle{12, 2}r2 := Rectangle{9, 4}c1 := Circle{10}c2 := Circle{25}fmt.Println("Area of r1 is: ", r1.area())fmt.Println("Area of r2 is: ", r2.area())fmt.Println("Area of c1 is: ", c1.area())fmt.Println("Area of c2 is: ", c2.area())
}

运行结果:

Area of r1 is:  24
Area of r2 is:  36
Area of c1 is:  314.1592653589793
Area of c2 is:  1963.4954084936207
  • 虽然method的名字一模一样,但是如果接收者不一样,那么method就不一样
  • method里面可以访问接收者的字段
  • 调用method通过.访问,就像struct里面访问字段一样

1.3 方法和函数

既然我们已经有了函数,为什么还要使用方法?
示例代码:

package mainimport (  "fmt"
)type Employee struct {  name     stringsalary   intcurrency string
}/*displaySalary() method converted to function with Employee as parameter
*/
func displaySalary(e Employee) {  fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)
}func main() {  emp1 := Employee{name:     "Sam Adolf",salary:   5000,currency: "$",}displaySalary(emp1)
}

在上面的程序中,displaySalary方法被转换为一个函数,而Employee struct作为参数传递给它。这个程序也产生了相同的输出:Salary of Sam Adolf is $5000.。
为什么我们可以用函数来写相同的程序呢?有以下几个原因

Go不是一种纯粹面向对象的编程语言,它不支持类。因此,类型的方法是一种实现类似于类的行为的方法。
相同名称的方法可以在不同的类型上定义,而具有相同名称的函数是不允许的。假设我们有一个正方形和圆形的结构。可以在正方形和圆形上定义一个名为Area的方法。这是在下面的程序中完成的。

1.4 变量作用域

作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。

Go 语言中变量可以在三个地方声明:

函数内定义的变量称为局部变量
函数外定义的变量称为全局变量
函数定义中的变量称为形式参数

局部变量

在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。

全局变量

在函数体外声明的变量称之为全局变量,首字母大写全局变量可以在整个包甚至外部包(被导出后)使用。

package mainimport "fmt"/* 声明全局变量 */
var g intfunc main() {/* 声明局部变量 */var a, b int/* 初始化参数 */a = 10b = 20g = a + bfmt.Printf("结果: a = %d, b = %d and g = %d\n", a, b, g)
}

运算结果:

结果: a = 10, b = 20 and g = 30

形式参数

形式参数会作为函数的局部变量来使用

指针作为接收者

若不是以指针作为接收者,实际只是获取了一个copy,而不能真正改变接收者的中的数据

func (b *Box) SetColor(c Color) {b.color = c
}

示例代码:

package mainimport ("fmt"
)type Rectangle struct {width, height int
}func (r *Rectangle) setVal() {r.height = 20
}func main() {p := Rectangle{1, 2}s := pp.setVal()fmt.Println(p.height, s.height)
}

运算结果:

20 2

如果没有那个*,则值就是2 2

1.5 method继承

method是可以继承的,如果匿名字段实现了一个method,那么包含这个匿名字段的struct也能调用该method

package mainimport "fmt"type Human struct {name  stringage   intphone string
}
type Student struct {Human  //匿名字段school string
}
type Employee struct {Human   //匿名字段company string
}func (h *Human) SayHi() {fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}
func main() {mark := Student{Human{"Mark", 25, "222-222-YYYY"}, "MIT"}sam := Employee{Human{"Sam", 45, "111-888-XXXX"}, "Golang Inc"}mark.SayHi()sam.SayHi()
}

运算结果:

Hi, I am Mark you can call me on 222-222-YYYY
Hi, I am Sam you can call me on 111-888-XXXX

1.6 method重写

package mainimport "fmt"type Human struct {name  stringage   intphone string
}
type Student struct {Human  //匿名字段school string
}
type Employee struct {Human   //匿名字段company string
}//Human定义method
func (h *Human) SayHi() {fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}//Employee的method重写Human的method
func (e *Employee) SayHi() {fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,e.company, e.phone) //Yes you can split into 2 lines here.
}
func main() {mark := Student{Human{"Mark", 25, "222-222-YYYY"}, "MIT"}sam := Employee{Human{"Sam", 45, "111-888-XXXX"}, "Golang Inc"}mark.SayHi()sam.SayHi()
}

运算结果:

Hi, I am Mark you can call me on 222-222-YYYY
Hi, I am Sam, I work at Golang Inc. Call me on 111-888-XXXX

方法是可以继承和重写的
存在继承关系时,按照就近原则,进行调用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vim编辑器

1.vi编辑器介绍 vim是全屏幕纯屏幕纯文本编辑器, 是vi编辑器的增强版. 可以利用别名让输入vi命令时, 实际上执行vim编辑器, 例如: alias vi "vim" #定义别名 这样定义的别名是临时生效, 如果需要永久生效, 请放入环境变量配置文件(~/.bashrc) 2.vim基本的使用 …

如何压缩照片?分享4种全面的方法!

随着智能手机的普及,我们每个人都成为了摄影爱好者。然而,随着拍摄的照片越来越多,手机内存也逐渐变得捉襟见肘。那么,如何有效地压缩照片,释放手机内存呢?今天,我们就来为你揭秘那些可以轻松压…

Innovus——将get的结果按行打印

之前用的是foreach遍历结果,一个一个打印的方法,后来发现使用join ** \n更方便。 foreach name [get_object_name [get_nets -of_objects [get_pins *HCTS*/I]]] {puts $name}join [get_object_name [get_nets -of_objects [get_pins *HCTS*/I]]] \n

【angular教程240110】07 Angular中的生命周期函数--动态挂载销毁组件

【angular教程240110】07 Angular中的生命周期函数–动态挂载销毁组件 目录 组件的生命周期1 前提条件2 生命周期的顺序3 Angular组件的生命周期函数:ngOnChanges()用途 ngOnInit()用途 ngDoCheck()用途 ngAfterContentInit()用途 ngAfterContentChecked()用途 ngA…

前端浏览器滚动条炫酷美化

一、文章引导 #mermaid-svg-2qRndEP8CFzlUhap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2qRndEP8CFzlUhap .error-icon{fill:#552222;}#mermaid-svg-2qRndEP8CFzlUhap .error-text{fill:#552222;stroke:#55222…

华为OD机试真题-最长的指定瑕疵度的元音子串-2023年OD统一考试(C卷)

题目描述: 开头和结尾都是元音字母(aeiouAEIOU)的字符串为 元音字符串 ,其中混杂的非元音字母数量为其 瑕疵度 。比如: “a” 、 “aa”是元音字符串,其瑕疵度都为0 “aiur”不是元音字符串(结尾不是元音字符) “abira”是元音字符串,其瑕疵…

多模态+SNN个人学习历程和心得

祖传开头 这次想写一个一直深藏心中的研究方向,那就是多模态方向。其实当初在实验室那会儿,最先接触的就是多模态的工作,因此这是我科研之路的起点。只不过,后来经历了一些波折,导致个人没有往这个方向深挖&#xff0…

PayPal账号被关联!跨境卖家如何自救?关于PayPal防关联你不得不知道的事!

很多跨境卖家的支付平台都会选择 PayPal,但是 PayPal 账号在使用过程中也经常会遇见关联,风控等问题,这时候为了保护我们的 PayPal 账号安全,防关联就很重要。今天龙哥就分享一些关于 PayPal 防关联的内容,希望能够帮助…

重新认识canvas,掌握必要的联结密码

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

C++ continue语句

作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环 与break的区别在于,如果把上述continue换位break,则该程序执行到break则会直接退出for循环,不再执行后面的代码和以后的循环。 实…

加载和保存模型参数

前言 深度学习框架提供了内置函数来保存和加载整个网络。需要注意的是,这将保存模型的参数而不是整个模型。 加载和保存 class MLP(nn.Module):def __init__(self):super().__init__()self.hiddennn.Linear(20,256)self.outputnn.Linear(256,10)def forward(self…

Web实战丨基于django+html+css+js的电子商务网站

文章目录 写在前面实验目标需求分析实验内容安装依赖库1.登陆界面2.注册界面3.电子商城界面4.其他界面 运行结果写在后面 写在前面 本期内容:基于DjangoHTMLCSSJS的电子商务网站 实验环境: vscode或pycharmpython(3.11.4)django 代码下载地址&#x…

【Kafka-3.x-教程】-【七】Kafka 生产调优、Kafka 压力测试

【Kafka-3.x-教程】专栏: 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

Android - 串口通讯(SerialPort)

最早的博客Android 模拟串口通信过程_launch virtual serial port driver pro-CSDN博客里就是用过 Google 提供的 demo,最近想再写个其他的demo发现用起来有点麻烦,还需要导入其他 module,因此在网上找到了Android-SerialPort-API: https://g…

数据分析---SQL(1)

目录 什么是数据倾斜问题SQL如何解决数据倾斜问题having和where的区别在union和join的区别举例说明使用union使用joincount(*)、count(字段)和count(distinct字段)的区别什么是数据倾斜问题 数据倾斜问题是指在数据分布不均匀的情况下,某些特定的数据分区或键值会出现过…

SpringBoot整合FreeMarker模板引擎

中文官方参考手册 http://freemarker.foofun.cn/ 1.先加入FreeMarker依赖 <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version> </dependency>2.新建一个FreeMark…

8 滑动窗口-无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…

观成科技-加密C2框架EvilOSX流量分析

工具简介 EvilOSX是一款开源的&#xff0c;由python编写专门为macOS系统设计的C2工具&#xff0c;该工具可以利用自身释放的木马来实现一系列集成功能&#xff0c;如键盘记录、文件捕获、浏览器历史记录爬取、截屏等。EvilOSX主要使用HTTP协议进行通信&#xff0c;通信内容为特…

Python 常用模块pickle

Python 常用模块pickle pickle序列化模块 【一】定义 序列化&#xff1a;将数据结构或对象转换为可存储或传输的格式反序列化&#xff1a;将序列化后的数据恢复为开始的数据结构或者对象 【二】目的 数据持久化存储远程通信缓存进程间通信 【三】序列化 将对象转换为字节…

蓝凌EIS pdf.aspx 任意文件读取漏洞

漏洞描述&#xff1a; 蓝凌EIS智慧协同平台是一个简单、高效的工作方式专为成长型企业打造的沟通、协同、社交的移动办公平台&#xff0c;覆盖OA、沟通、客户、人事、知识等管理需求&#xff0c;集合了非常丰富的模块&#xff0c;满足组织企业在知识、项目管理系统建设等需求的…