golang方法详解
Go 语言 类型方法是一种对类型行为的封装 。Go 语言的方法非常纯粹, 可以看作特殊类型的函数,其显式地将对象实例或指针作为函数的第一个参数,并且参数可以自己指定,而不强制要求一定是 this或self。 这个对象实例或指针称为方法的接收者 (reciever)。
方法声明
为命名类型定义方法的语法格式如下:
// 类型方法接收者是值类型
func (t TypeName) MethodName (ParamList ) (Returnlist) {
// method body
} // 类型方法接收者是指针
func (t *TypeName) MethodName (ParamList) (Returnlist) {
// method body
}
说明:
- t 是接收者,可以自由指定名称。
- TypeName 为命名类型的类型名。
- MethodName 为方法名,是 个自定义标识符。
- ParamList 是形参列表。
- ReturnList 是返回值列表。
Go语言的类型型方法本质上就是一个函数,没有使用隐式的指针,这是Go的优点,简单明了。我们可以将类型的方法改写成常规的函数。示例如下:
// 类型方法接收者是值类型
func TypName MethodName(t TypeName , otherParamList) (Returnlist) {
//method body
} // 类型方法接收者是指针
func TypName MethodName (t *TypeName , otherParamList) (Returnlist) {
//method body
} // 示例
type SliceInt []int // 定义一个 SliceInt的方法,实现累加切边成员的功能
func (s SliceInt) Sum() int {
sum := 0
for _, i := range s{
sum += i
}
return sum
} // 这个函数和上面的方法等价
func SliceInt_Sum(s SliceInt) int {
sum := 0
for _, i := range s {
sum += i
}
return sum
} var s SliceInt = [] int {1, 2, ,3, 4}
// 使用方法访问
s.Sum()
// 直接访问
SliceInt_Sum(s)
类型方法有如下特点
(1)可以为命名类型增加方法(除了接口),非命名类型不能自定义方法。 (非命令类型指型由预声明类型、关键字和操作符组合而成的类型,例如数组、切边、通道、指针、函数等)
比如不能为 [ ] int 类型增加方法,因为 [ ] int 是非命名类型。接口类型本身就是一个方法的签名集合,所以不能为其增加具体的实现方法。
(2)为类型增加方法有一个限制,就是方法的定义必须和类型的定义在同一个包中。
不能再为 int、bool 等预声明类型增加方法,因为它们是命名类型,但它们是 Go 语言内置的预声明类型,作用域是全局的,为这些类型新增的方法是在某个包中,这与第(2)条规则冲突,所以Go编译器拒绝为int增加方法。
(3)方法的命名空间的可见性和变量一样,大写开头的方法可以在包外被访问,否则只能 在包内可见。
(4)使用 type 定义的自定义类型是一个新类型,新类型不能调用原有类型的方法,但是底层类型支持的运算可以被新类型继承。
type Map map[string)string func (m Map) Print() {
// 类型支持的 range 运算 新类型可用
for _, key := range m{
fmt.Println(key)
}
} type MyInt int func main() {
var a MyInt = 10
var b MyInt = 10 // int 类型支持的加减乘除运算,新类型同样可用
c := a + b
d := a * b fmt.Println("%d\n", c)
fmt.Println("%d\n", d)
}
方法调用
总结一下方法调用,类型方法的一般调用方式:
TypeinstanceName.MethodName(ParamList)
TypeinstanceName: 类型实例名或指向实例的指针变量名;
MethodName: 类型方法名;
ParamList: 方法实参。
示例:
type T struct {
a int
} func (t T) Get() int {
return t.a
} func (t *T) Set (i int) {
t. a = i
} var t = &T{} // 普通方法调用
t.Set(2) // 普通方法调用
t.Get( )
方法值( method value )
变量x的静态类型是T, M是类型T的一个方法, x.T被称为方法值(method value), x.T是一个函数类型变量,可以赋值给其他变量 。例如:
f : = x.M
f (args .. . )
等价于
x.M(args ... )
方法值(method value)其实是一个带有闭包的函数变量,其底层实现原理和带有闭包的匿名函数类似,接收值被隐式地绑定到方法值(method value)的闭包环境中。后续调用不需要再显式地传递接收者。例如:
type T struct {
a int
} func (t T) Get() int {
return t.a
} func (t *T) Set (i int ) {
t.a = i
} func (t *T) Print () {
fmt.Printf ("%p, %v, %d \n", t, t, t.a)
} var t =&T{} //method value
f := t.Set // 方法值调用
f(2)
t.Print() //结果为 0xc4200140b8, &{2}, 2 //方法值调用, 接受值保存了方法值的环境
f(3)
t.Print() //结果为 0xc4200140b8, &{3}, 3
golang方法详解的更多相关文章
- session的使用方法详解
session的使用方法详解 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器 ...
- Kooboo CMS - Html.FrontHtml[Helper.cs] 各个方法详解
下面罗列了方法详解,每一个方法一篇文章. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解 Kooboo CMS - Html.FrontHtml.Posit ...
- HTTP请求方法详解
HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定 ...
- ecshop后台增加|添加商店设置选项和使用方法详解
有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- windows.open()、close()方法详解
windows.open()方法详解: window.open(URL,name,features,replace)用于载入指定的URL到新的或已存在的窗口中,并返回代表新窗口的Win ...
- CURL使用方法详解
php采集神器CURL使用方法详解 作者:佚名 更新时间:2016-10-21 对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程 ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
随机推荐
- 了解PCI Express的Posted传输与Non-Posted传输
0.写在前面 本文首发于公众号[两猿社],后续将在公众号内持续更新~ 其实算下来接触PCIe很久了,但是由于之前换工作,一直没有系统的学习和练手项目,现在新项目买了Synopsys的PCIe IP,总 ...
- c语言提取浮点型数据的整数部分与小数部分几种方法
一 前记 最近涉及到把各种传感器的数据通过wifi和bt传输出去,这就涉及到了浮点传输的问题,为了方便传输,笔者的做法一般是把小数和整数部分分开,分别传输,这就比较简单明晰了. 二 方法论 其实,把浮 ...
- nginx代理图片上传以及访问
nginx代理图片上传 首先需要利用nginx代理图片访问参考 https://www.cnblogs.com/TJ21/p/12609017.html 编写接受文件的controller @Post ...
- Material Design 组件之 AppBarLayout
AppBarLayout 是一个垂直方向的 LinearLayout,它实现了许多符合 Material Design 设计规范的状态栏应该具有的功能,比如滚动手势. AppBarLayout 一般直 ...
- P1250 种树(差分约束 / 贪心)
题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1-N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E,T ...
- Lisp-01: 相关开发环境配置部署
Common Lisp 学习笔记系列01 要学一门编程语言,首先需要将语言的环境配置好.如果想要个直接上手的环境,感谢日本的大神 Shirakumo,打造了一个 Common Lisp 的 IDE - ...
- 国内 Java 开发者必备的两个装备,你配置上了么?
虽然目前越来越多的国产优秀技术产品走出了国门,但是对于众领域的开发者来说,依然对于国外的各种基础资源依赖还是非常的强.所以,一些网络基本技能一直都是我们需要掌握的,但是速度与稳定性问题一直也都有困扰着 ...
- Light of future-凡事预则立
目录 1.冲刺的时间计划安排 2.针对上一次作业同学.助教提出的问题的回答 3.针对前几次作业的不足的地方进行思考和总结 4.需要改进的团队分工 5.团队的代码规范 6.Github仓库链接 归属班级 ...
- 1065 A+B and C (64bit) (20分)(水)
Given three integers A, B and C in [−], you are supposed to tell whether A+B>C. Input Specificati ...
- Shell:Day06.笔记
sed命令 Linux文本处理三剑客 之 sed sed stream EDite 作为行编辑器,对文本进行编辑(以行为单位进行编辑) 注意:sed编辑文件,却不改变原文件: sed的工作原理: ...