方法

基本介绍

在某些情况下,我们要需要声明(定义)方法。比如 Person 结构体:除了有一些字段外( 年龄,姓名…),Person 结构体还有一些行为比如:可以说话、跑步…,通过学习,还可以做算术题。这时就要用方法 才能完成。

Golang 中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型, 都可以有方法,而不仅仅是 struct。

方法的声明和调用

type A struct { Num int
}
func (a A) test() { fmt.Println(a.Num)
}

对上面的语法的说明

  1. func (a A) test() {} 表示 A 结构体有一方法,方法名为 test
  2. (a A) 体现 test 方法是和 A 类型绑定的

举例说明

对上面的总结

  1. test 方法和 Person 类型绑定

  2. test 方法只能通过 Person 类型的变量来调用,而不能直接调用,也不能使用其它类型变量来调用

  3. func (p Person) test() {}… p 表示哪个 Person 变量调用,这个 p 就是它的副本, 这点和函数传参非 常相似。

  4. p 这个名字,有程序员指定,不是固定, 比如修改成 person 也是可以

方法快速入门

  1. 给 Person 结构体添加 speak 方法,输出 xxx 是一个好人

  2. 给 Person 结构体添加 jisuan 方法,可以计算从 1+…+1000 的结果, 说明方法体内可以函数一样, 进行各种运算

  3. 给 Person 结构体 jisuan2 方法,该方法可以接收一个数 n,计算从 1+…+n 的结果

  4. 给 Person 结构体添加 getSum 方法,可以计算两个数的和,并返回结果

  5. 方法的调用

方法的调用和传参机制原理:(重要!)

说明: 方法的调用和传参机制和函数基本一样,不一样的地方是方法调用时,会将调用方法的变量,当做实参也传递给方法。下面我们举例说明。

  • 案例 1:
    画出前面 getSum 方法的执行过程+说明

    说明:
  1. 在通过一个变量去调用方法时,其调用机制和函数一样
  2. 不一样的地方时,变量调用方法时,该变量本身也会作为一个参数传递到方法(如果变量是值类 型,则进行值拷贝,如果变量是引用类型,则进行地址拷贝)
  • 案例 2
    请编写一个程序,要求如下:
  1. 声明一个结构体 Circle, 字段为 radius
  2. 声明一个方法 area 和 Circle 绑定,可以返回面积。
  3. 提示:画出 area 执行过程+说明

方法的声明(定义)

func (recevier type) methodName(参数列表) (返回值列表){方法体return 返回值
}
  1. 参数列表:表示方法输入
  2. recevier type : 表示这个方法和 type 这个类型进行绑定,或者说该方法作用于 type 类型
  3. receiver type : type 可以是结构体,也可以其它的自定义类型
  4. receiver : 就是 type 类型的一个变量(实例),比如 :Person 结构体 的一个变量(实例)
  5. 返回值列表:表示返回的值,可以多个
  6. 方法主体:表示为了实现某一功能代码块
  7. return 语句不是必须的。

方法的注意事项和细节

  1. 结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式
  2. 如程序员希望在方法中,修改结构体变量的值,可以通过结构体指针的方式来处理
  3. Golang 中的方法作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型, 都可以有方法,而不仅仅是 struct, 比如 int , float32 等都可以有方法
  4. 方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母 大写,可以在本包和其它包访问。
  5. 如果一个类型实现了 String()这个方法,那么 fmt.Println 默认会调用这个变量的 String()进行输出

方法和函数区别

  1. 调用方式不一样
    函数的调用方式: 函数名(实参列表) 方法的调用方式: 变量.方法名(实参列表)

  2. 对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然

  3. 对于方法(如 struct 的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反 过来同样也可以


    总结:

  4. 不管调用形式如何,真正决定是值拷贝还是地址拷贝,看这个方法是和哪个类型绑定.

  5. 如果是和值类型,比如 (p Person) , 则是值拷贝, 如果和指针类型,比如是 (p *Person) 则 是地址拷贝。

面向对象例题

学生案例:

  1. 编写一个 Student 结构体,包含 name、gender、age、id、score 字段,分别为 string、string、int、 int、float64 类型。
  2. 结构体中声明一个 say 方法,返回 string 类型,方法返回信息中包含所有字段值。
  3. 在 main 方法中,创建 Student 结构体实例(变量),并访问 say 方法,并将调用结果打印输出。
package main
import ("fmt")type Student struct{name stringgender stringage intid intscore float64
}func (student *Student) say() string{infoStr := fmt.Sprintf("student 的信息 name=[%v] gender=[%v], age=[%v] id=[%v] score=[%v]", student.name, student.gender, student.age, student.id, student.score)return infoStr
}func main() {//测试//创建一个 Student 实例变量var stu = Student{ name : "tom", gender : "male", age : 18,id : 1000,score : 99.98,}fmt.Println(stu.say())
}

创建结构体变量时指定字段值

说明
Golang 在创建结构体实例(变量)时,可以直接指定字段的值

  • 方式 1

  • 方式 2

Golang笔记——方法相关推荐

  1. Golang笔记——channel(管道)

    推荐首先阅读:Golang笔记--goroutine(协程) 为什么需要 channel 前面使用全局变量加锁同步来解决 goroutine 的通讯,但不完美 主线程在等待所有 goroutine 全 ...

  2. golang笔记15--go语言单任务版爬虫

    golang笔记15--go语言单任务版爬虫 1 介绍 2 单任务版爬虫 2.1 获得初始页面内容 2.2 正则表达式 2.3 提取城市和 url 2.4 单任务版爬虫的架构 2.5 Engine 与 ...

  3. golang笔记16--go语言并发版爬虫

    golang笔记16--go语言并发版爬虫 1 介绍 2 并发版爬虫 2.1 并发版爬虫架构 2.2 简单调度器 2.3 并发调度器 2.4 队列实现调度器 2.5 重构和总结 2.6 更多城市 2. ...

  4. GoLang笔记—基础语法篇

    GoLang笔记 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态类型.编译型语言.Go 语言语法与 C ...

  5. GoLang之方法与接口

    GoLang之方法与接口 Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的this指针等. 方法 Go 语言中同时有函数和方法.方法就是一个包含了接受者(re ...

  6. java笔记 方法_Java笔记-方法

    Java笔记-方法 1.何谓方法 2.方法的定义和调用 package src.method; import java.util.Scanner; public class Demo02 { publ ...

  7. Golang 加密方法

    如果想直接使用我下列的库 可以直接go get 我的github go get -u github.com/hybpjx/InverseAlgorithm md5 加密--不可逆 MD5信息摘要算法是 ...

  8. 印象笔记导入为知笔记方法

    印象笔记导入为知笔记方法: 目前为知笔记windows版中自带EverNote导入插件,在程序右上角点击"菜单"按钮,文件–导入Evernote,选择浏览会自动搜索到EverNot ...

  9. YDOOK :Golang 各大操作系统 完全卸载删除 golang 的方法教程

    YDOOK :Golang 各大操作系统 完全卸载删除 golang 的方法教程 1. 直接删除 Golang 安装包: 如果是默认安装,Golang 的默认安装目录为: a. Linux.Mac O ...

最新文章

  1. 科大星云诗社动态20210415
  2. Angular bootstrap的一个例子
  3. 精通 RPM 之查询篇
  4. 论文浅尝 | 一种可解释的语义匹配复值网络
  5. 继续更新,关于MFC琐碎思索
  6. Multi-thread--C++11中thread的使用
  7. Dijkstra求最短路 II
  8. bind(),live(),delegate(),on()绑定事件方式
  9. 利用TCP协议进行ping
  10. 【端口扫描工具】nmap核心使用方法
  11. java雷霆战机图片_JAVA开发《雷霆战机》雷电类游戏效果演示
  12. 威漫哨兵机器人_漫威:哨兵机器人能不能打过复仇者联盟?
  13. 关于JPsh极光推送的基本用法和通知介绍
  14. 计算机表格公开课,Word表格制作教案公开课
  15. 超图申请试用以及激活
  16. python数据结构,快慢指针
  17. 学习笔记(5):物联网硬件基础-电压源与电流源
  18. WiFi信号扩展的最佳方案
  19. 微信转盘抽奖前端源码(一):8个奖品,指针开始时指向缝隙
  20. 抖音服务器带宽有多大,才能供上亿人同时刷?

热门文章

  1. 聊聊rocketmq的ConsumerIdsChangeListener
  2. java 课后习题 温度转换
  3. Springmvc 关于静态资源转发的问题解决
  4. 更换 PVE7 软件仓库源和 CT 模板(LXC)源为国内源
  5. C#设计模式之19-观察者模式
  6. vim 文本编辑器_Vim Windows安装指南–如何在PC上的PowerShell中运行Vim文本编辑器
  7. java 一些容易忽视的小点-数据类型和运算符篇
  8. ipython和anaconda区别_anaconda和python区别
  9. 【linux命令】Centos下如何匹配内容在哪个文件中
  10. Python的10个神奇的技巧