Go:方法
一、基本介绍
在某些情况下,我们需要定义方法。比如 Person 结构体,除了有一些字段外(姓名、年龄...),还可以有一些行为动作(吃、唱歌...),这就需要用方法才能实现。
Go中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是 struct 有。
示例:
type Person struct {
Name string
}
// 给Person类型绑定一个方法
func (person Person) Eat() {
fmt.Printf("%s正在吃东西...", person.Name)
}
func main() {
person := Person{"pd"}
person.Eat() // 调用方法
}
对上面代码总结:
- Eat 方法和 Person 类型绑定;
- Eat 方法只能通过 Person 类型的(变量 / 实例 / 对象)来调用,而不能直接调用,也不能使用其他类型的实例来调用;
- func (person Person) Eat() {},person表示哪个Person的实例调用,可以理解为 java 中的 this,python 中的 self;
- 方法的参数、返回值与函数一样。
二、方法的引用传递与值传递
结构体是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝的传递方式。如果想在方法中,修改结构体字段的值,可以通过结构体指针的方式来处理。
type Person struct {
Name string
Age int
}
func (p *Person) Change() {
/*
因为 p 是指针,所以标准的访问字段的方式是 (*p).Name,但写成
p.Name 也是可以的,因为编译器在底层会帮我们处理,方便程序员
使用。
同理,在下面的 main 函数中,本因 (&p).Change() 这样调用方法,
但写成 p.Change() 也是可以的。
*/
p.Name = "乔治"
p.Age = 20
}
func (p Person) Change1() {
p.Name = "诺手"
p.Age = 22
}
func main() {
p := Person{"佩奇", 10}
fmt.Println(p.Name, p.Age) // 佩奇 10
p.Change()
fmt.Println(p.Name, p.Age) // 乔治 20
p1 := Person{"德玛", 11}
p1.Change1()
fmt.Println(p1.Name, p1.Age) // 德玛 11
(&p1).Change1() // 同理,编译器会优化,因为 Change1() 中的Person不是一个指针
fmt.Println(p1.Name, p1.Age) // 德玛 11
}
结论:不管结构体实例是 p.Change() 还是 (&p).Change() 的形式调用方法,都是由方法中 p 对应的结构体是 *Person 还是 Person 决定的!!!,*Person就是引用传递,Person就是值传递。
Go:方法的更多相关文章
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 【.net 深呼吸】细说CodeDom(6):方法参数
本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...
- IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法
直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- ArcGIS 10.0紧凑型切片读写方法
首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...
- [BOT] 一种android中实现“圆角矩形”的方法
内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...
- JS 判断数据类型的三种方法
说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
随机推荐
- E20170521-ts
redirect vt. 使改寄,更改(信件等)姓名地址; 改变方向,改变线路; 重新寄送; teletype n. 电传打字机,电报交换机,打字电报通讯; descriptor n. 描述符; ...
- bzoj 2152: 聪聪可可【点分治】
裸的点分治,运算在模3下进行然后统计答案的时候统计余1的*余2的*2+余0的^2 #include<iostream> #include<cstdio> using names ...
- bzoj 4555: [Tjoi2016&Heoi2016]求和【NTT】
暴力推式子推诚卷积形式,但是看好多blog说多项式求逆不知道是啥.. \[ \sum_{i=0}^{n}\sum_{j=0}^{n}S(i,j)*2^j*j! \] \[ S(i,j)=\frac{1 ...
- bzoj 2508: 简单题【拉格朗日乘数法】
大概是对于f(x,y)求min,先把x看成常数,然后得到关于y的一元二次方程,然后取一元二次极值把y用x表示,再把x作为未知数带回去化简,最后能得到一个一元二次的式子,每次修改这个式子的参数即可. 智 ...
- macbook pro上安装vmware虚拟机
http://xclient.info/s/vmware-fusion.html?_=84739015bcde24a4cc7a744d2d5f748b https://docs.vmware.com/ ...
- ACMer需要的 java基本知识
1.基本定义 import java.util.*; import java.io.*; public class Main { public static void main(String[] ar ...
- Oracle查看所有表空间的数据使用情况
-- 查看所有表空间的数据使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)& ...
- APP多渠道打包
多渠道打包的概念: 打包是指使用证书文件对app签名生成一个apk文件. 多渠道打包指的就是我们的app在开发完成之后需要投放到不同的市场,比如说Google市场.百度市场等,为了统计应用在各个市场的 ...
- 动态生成li标签,并设置点击事件
今天要解释的是如下界面 主要实现了: 1.模拟后台的json数据,动态生成li标签 2.导航栏的下划线 3.给li标签右边设置图片 4.动态生成的li标签,设置选中的li的点 ...
- Oracle的一些名词和概念
1.数据库 这里的数据库不是通常情况下我们所说的数据库,而是一个Oracle的专业名词.它是磁盘上存储数据的集合,在物理上表现为数据文件. 日志文件和控制文件等,在逻辑上以表空间形式存在.使用时,必须 ...