Go(Golang)_06_方法
@
方法
方法(封装):只能由特定对象调用的函数
1)方法就是特殊的函数,其只能由其在定义时指定的数据类型对象调用;
2)子结构体会继承结构体的所有方法;
3)调用方法格式:对象.方法(参数)
方法定义的格式(类似函数):
func (接收者 数据类型) 方法名(参数列表)(返回值列表) {
程序段
}
1)不同数据类型接收者的方法名可重名(数据类型都拥有独立的namespace);
2)方法名可与函数名重名(编译器对方法进行隐式命名);
3)同一数据类型拥有的所有方法名具有唯一性;
4)方法名不可与结构体对象中的字段重名;
接收者:可调用对应方法的数据类型对象
1)不可为Go中的内置类型指定方法(指针和接口类型也不可);
2)接收者的数据类型可为自定义类型或指向自定义类型的指针;
3)可通过自定类型的对象或自定类型的指针对象调用对应方法;
//内置类型:数、布尔、字符串、数组、slice、map和函数(func);
//自定义类型:结构体(struct)、接口(interface)、命名类型(type);
如:定义结构体类型并定义属于该类型方法,且调用该方法
1)编写程序;
2)运行结果;
通过方法实现封装的流程:
1)将结构体和其字段名的首字母全部小写(保护数据);
2)结构体所在的包中提供一个工厂模式函数(功能:构造函数);
3)提供首字母大写的Set方法(功能:判断并赋值);
4)提供首字母大小的Get方法(功能:获取值);
指针接收者
指针接收者:指定接收者的数据类型时,使用该类型的指针形式
1)若定义时是指针接收者,则在调用时应也使用指针类型(即使不需要);
2)不论调用对象和接收者的类型,都可实现该类型的对象可调用方法;
3)特殊情况下指针接收者也可为nil(应在注释中显示标明);
(1)调用对象和接收者均为自定义类型或自定义类型的指针类型
1)编译器根据调用对象的数据类型匹配包含对应接收者的方法,并调用;
2)例:对象.方法
(2)调用对象为自定义类型,接收者为自定义类型的指针类型
1)编译器会隐式的在调用对象前添加取地址符“&”;
2)例:对象.方法(参数)
----> &对象.方法(参数)
(3)调用对象为自定义类型的指针类型,接收者为自定义类型
1)编译器会隐式的在调用对象前添加解引用符“*”;
2)例:对象.方法(参数)
---->*对象.方法(参数)
如:定义字典类型的方法,并调用
1)编写程序;
2)运行结果;
方法继承
方法继承:子结构体会继承父结构体中所有的字段和方法
1)本质:编译器将父结构体的方法复制,并将其接收者改为子结构体类型;
2)参数类型为父结构体时,传入子结构体需显示指定其父结构体字段;
如:通过继续父结构体定义字段,并调用父结构体的方法
1)编写程序;
2)运行结果;
方法变量/表达式
方法变量(方法值):将方法当作数据类型定义变量
1)本质:代表指定结构体对象的方法
2)调用格式:方法变量(参数)
方法变量的定义格式:方法变量名 := 对象.方法
如:通过方法变量调用方法
1)编写程序;
2)运行结果;
方法表达式:将结构体对象作为参数传入
1)本质:通过传入的结构体对象调用与表达式绑定的方法
2)调用格式:方法表达式(结构体对象)
方法表达式的定义格式:方法表达式名 := 结构体.方法
1)结构体需明确指定其为自定义类型还是自定义类型的指针;
2)调用时根据结构体的类型,判断传入普通对象还是地址;
如:通过方法表达式调用方法
1)编写程序;
2)运行结果;