golang基础--method方法
Go没有类似python语言中类class的概念,但依旧有method
- 类型方法定义格式如下
func (a mytype) method_name(x type)(y type){ return y } - 调用方式:
instance.method(args) -> (type).func(instance, args)
- 类型方法定义格式如下
通过显示的说明Receiver(强制函数传递的第一个参数)来实现与某个类型(struct,int...)的组合
package main
import "fmt" type A struct{
Name Sting
} func main() {
a := A{} //实例化结构体
a.Method_Print() //结构体调用方法
} func (a A) Method_Print() { //强制将A(struct类型)作为第一个参数传递给Method_Print,从而说明此函数属于结构A的一个方法
fmt.Println("This is a method for struct A")
} /*输出
This is a method for struct A
*/
只能为同一个包
package中的类型定义方法(method),不能为非本package中的类型定义方法,但是方法(这里指公有方法)是可以在其它包中调用。可以只用值或指针来调用方法,编译器会自动完成转换
package main
import "fmt" type A struct {
Name string
} type B struct {
Name string
} func main() {
a := A{} //实例化结构体
a.Method_Print() //结构体调用方法
fmt.Println(a.Name) //指针传递时,不用使用`*a.Name`,解释器自动识别 b := B{}
fmt.Println(b.Name)
b.Method_Print()
} func (a *A) Method_Print() { //方法传递结构体指针
a.Name = "maozi"
fmt.Println("This is a method for struct A")
} func (b B) Method_Print() { //方法:传递结构
b.Name = "Sazi" //这种方式只能进行值的拷贝,无法进行更改结构体属性(字段)
fmt.Println("This is a method for struct B")
} /*输出
a.Method_Print--- This is a method for struct A
a.Name--- maozi
b.Name-- //空值,修改失败
b.Method_Print This is a method for struct B
*/
类型别名(如下代码INT为int类型的别名)不会拥有底层类型所附带的方法;可以为任一底层类型(int...)绑定一个方法,如下
Method_Printpackage main
import "fmt" type INT int //自定义一个类型INT,底层为int类型,INT就是底层类型int的一个别名 func main() {
var a INT
a.Method_Print() } func (a *INT) Method_Print() { //为int类型绑定一个方法
fmt.Println("This is a method for int type ")
} /*输出
a.Method_Print---This is a method for int type
*/
Method Values 和 Method Expressions
Method Value 是包装后的状态对象,总是与特定的对象实例关联在一起
调用方式类似python类的调用方式,先实例化一个类,在通过
.属性调用Method Expression是直接
类型.method(var)的方式
package main
import "fmt" type INT int //定义一个INT func main() {
var a INT
a.Method_Print() //method value调用方式
(*INT).Method_Print(a) //method expression调用方式
} func (a *INT) Method_Print() { //为int类型绑定一个方法
fmt.Println("This is a method for int type ")
}
/*输出
a.Method_Print---This is a method for int type
*/
类方法名称冲突类似与字段的名称冲突,按继承顺序;如果外部结构和嵌入的结构体存在同名方法,则优先调用外部结构体的方法
类方法访问权限:大写首字母表示外部可以访问,小写表示结构体类型的私有字段,私有字段和方法只能在同一个包中调用,只有公有方法(首字母大写)可以在包外调用
package main
import "fmt" type A struct {
name string //小写首字母,私有字段
} func main() {
a := A{}
a.Method_Print() //method value调用方式
} func (a *A) Method_Print() {
a.name = "123" //方法可以访问私有字段
fmt.Println("This is a method for struct type ")
} /*输出
a.Method_Print---This is a method for int type
*/
声明一个底层为int的类型,实现调用一个方法就递增250, 如x:=0,调用a.Increase(num)后,a从0变为250
package main
import "fmt" type Ad int //声明底层类型为int类型
func main() {
var x Ad
x.Add(250) //method value调用方式,方法传递参数num=100
fmt.Println(a)
}
func (ad *Ad) Add(num int) { //为int类型绑定一个方法
*ad += Ad(num) //强制类型转换为底层Ad---int型
}
/*输出
a--->250
*/
golang基础--method方法的更多相关文章
- Golang 基础之基础语法梳理 (三)
大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ...
- Java基础02 方法与数据成员
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在Java基础01 从HelloWorld到面向对象,我们初步了解了对象(obje ...
- GoLang基础数据类型--->字典(map)详解
GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...
- GoLang基础数据类型-切片(slice)详解
GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...
- GoLang基础数据类型--->数组(array)详解
GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...
- GoLang基础数据类型--->字符串处理大全
GoLang基础数据类型--->字符串处理大全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入: 高级运维工程师之路 59843264 ...
- Golang 基础之基础语法梳理 (二)
大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第二章节 Golang 基础之基础语法梳理 (一) Gol ...
- Golang基础教程
以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一.go语言结构: 二.go基础语法: 三.变量 四.常量 五.运算符 六.条件语句 七.循环 八.函数 九.变量作用域 ...
- golang基础知识之encoding/json package
golang基础知识之json 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.可以去json.org 查看json标准的清晰定义.json pack ...
随机推荐
- 7、Node.js EventEmitter
#######################################################################################介绍Node.js Eve ...
- SQL脚本修改表结构
SQL脚本修改表结构 新建表:create table [表名]([自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,[字段1] nVarChar(50) default ...
- jQueryeasyUI+Hibernate+struts2实现商城后台管理之复合类别
一.在Category.java中添加父类别和子类别两个变量,并生成get/set方法
- TCP传输层协议的流程
http://blog.chinaunix.net/uid-24399976-id-77905.html 通过对互联网的认识,我们发现TCP传输层协议是网络进行工作的核心也是基础.它的重要性我们在此也 ...
- 【[CQOI2011]动态逆序对】
这是我的第一个数据结构套数据结构 不是线段树套\(Splay\),而是非常蛇皮的块状链表套树状数组 如果这里按照\(\sqrt{n}\)的大小来分块,那么就需要\(n\sqrt{n}\)的空间,可能开 ...
- P2059 [JLOI2013]卡牌游戏
题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把 ...
- win10 系统下获取系统版本号为6.2的问题
近期赶时髦升级了win10,用着挺爽.但是某天在测试一个bug时发现要对win10做特殊处理,于是直接调用了GetVersionEx,并取出版本号进行判断,但是发现得到的版本竟然是6.2.当时就被雷到 ...
- FireFox新标签页打开搜索和书签
FireFox更新,发现界面完全不适应,虽然他是越做越丑,但是也没办法,一直用FireFox,许多书签,保存的密码现在都记不住了,只能靠保存的自动填充.... 进入正题,FireFox更新了之后,搜索 ...
- .net中使用mysql回滚和sqlserver回滚的区别
关于sqlserver事务和mysql事务 首先这是一种方法 public static int GetExecteQuery() { SqlConnection ...
- 6 spark 存储体系
6.1 block存储体系 存储体系架构图 6.2 block 信息信息管理器 6.2.2 bock锁的实现 6.3 磁盘block管理 /* * Licensed to the Apache Sof ...