博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
方法,接口学习笔记
阅读量:6904 次
发布时间:2019-06-27

本文共 2884 字,大约阅读时间需要 9 分钟。

之前在开发中编得过就行,没有好好地去思考一些细节问题,比如interface到底有什么用,现在好好总结下

1.方法

package mainimport "fmt"import "reflect"type S struct {    a int}func (s S) Set1(v int) {    s.a = v}func (s *S) Set2(v int) {    s.a = v}func (s *S) Get() int {    return s.a}func main() {    var s1 S    var s2 *S    s1.Set1(100)//receiver类型为T的实例,Set1修改的只是s1的副本    fmt.Println(s1.Get())    s1.Set2(100)//receiver类型为*T的实例,Set2修改的是s1的引用    fmt.Println(s1.Get())    fmt.Println("....s1 Method Set....")//receiver类型为T只包含T的方法集,receiver类型为*T包含T和*T的方法集    DumpMethodSet(s1)    fmt.Println("....s2 Method Set....")    DumpMethodSet(s2)}func DumpMethodSet(i interface{}) {    MethodSet := reflect.TypeOf(i)    for i := 0; i < MethodSet.NumMethod(); i++ {        fmt.Println(MethodSet.Method(i).Name)    }}

注意,用receiver类型为T的实例去调用方法其实可以调用到所有T和*T的方法,不受方法集约束,编辑器会自动找到对应方法并转换 receiver 实参

下面这个例子可以看出,T和*T作为receiver方法集的不同会导致什么错误

package maintype I interface {    Set1(int)    Set2(int)}type S struct {    a int}func (s S) Set1(v int) {    s.a = v}func (s *S) Set2(v int) {    s.a = v}func main() {    var s1 S    var s2 *S    var a1 I = s1//ERROR: cannot use s1 (type S) as type I in assignment:                 //S does not implement I (Get method has pointer receiver)    var a2 I = s2    _ = a1    _ = a2}

2.接口

package mainimport "fmt"type PCer interface { //1.接口命名习惯以er结尾    GetBrand() string    Memoryer //2.接口可以嵌入接口    Cpuer    //3.接口只是方法集,不含数据字段    PrintInfo()}//内存条type Memoryer interface {    GetMemory() int}//CPUtype Cpuer interface {    GetCpu() int}type HighEndPC struct {    Brand        string    MemoryCap    int    CpuKernlCnt  int    GpuMemoryCap int}type LowhEndPC struct {    Brand       string    MemoryCap   int    CpuKernlCnt int}func (self *HighEndPC) GetBrand() string {    return self.Brand}func (self *HighEndPC) GetMemory() int {    return self.MemoryCap}func (self *HighEndPC) GetCpu() int {    return self.CpuKernlCnt}func (self *HighEndPC) GetGpu() int {    return self.GpuMemoryCap}func (self *HighEndPC) PrintInfo() {    fmt.Printf("高端电脑 品牌:%s,内存大小%d,处理器核心数%d,显存大小%d \n", self.Brand, self.MemoryCap, self.CpuKernlCnt, self.GpuMemoryCap)}func (self *LowhEndPC) GetBrand() string {    return self.Brand}func (self *LowhEndPC) GetMemory() int {    return self.MemoryCap}func (self *LowhEndPC) GetCpu() int {    return self.CpuKernlCnt}func (self *LowhEndPC) PrintInfo() {    fmt.Printf("低端电脑 品牌:%s,内存大小%d,处理器核心数%d \n", self.Brand, self.MemoryCap, self.CpuKernlCnt)}func main() {    companyPC := LowhEndPC{"dell", 8, 2}    homePC := HighEndPC{"diy", 16, 4, 11}    myPC := []PCer{&companyPC, &homePC} //4.PCer是companyPC和homePC的抽象,只要实现了接口中的方法,就可以塞进去    for _, pc := range myPC {        pc.PrintInfo()    }}

运行结果:

低端电脑 品牌:dell,内存大小8,处理器核心数2
高端电脑 品牌:diy,内存大小16,处理器核心数4,显存大小11

这个例子展现了interface的一些特性和应用场景,类似于C++的多态的思想,但是不需要显式地去让struct去“继承”interface的方法集,只要这个struct实现了interface中所有方法,这个实现是指实现了相同名称、参数列表 (不包括参数名) 以及返回值的方法。

转载地址:http://bymdl.baihongyu.com/

你可能感兴趣的文章
C# 匿名函数
查看>>
MySQL锁系列2 表锁
查看>>
Lua中的closure(闭合函数)
查看>>
一个int类型引发的bug
查看>>
js 片段 - 控制类型为 text 的 input 类型
查看>>
CentOS安装中文支持(linux中文文件名乱码)
查看>>
[原创]ExtAspNet秘密花园(二) — 一切从头开始
查看>>
Delphi 常用控件之TlistView总结
查看>>
QUnit系列 -- 1.介绍单元测试(上)
查看>>
开发API文档相关问题(*.chm)
查看>>
分布拟合——正态/拉普拉斯/对数高斯/瑞利 分布
查看>>
隐藏执行批处理bat文件
查看>>
函数y=sin(1/x)曲线
查看>>
WebStorm for Mac(Web 前端开发工具)破解版安装
查看>>
computational biology | Bioinformatician | 开发者指南
查看>>
从0开始--倒序输出。
查看>>
吉特仓库管理系统-.NET打印问题总结
查看>>
POJ 3026 Borg Maze(bfs+最小生成树)
查看>>
sqlplus 返回2 由于命令后没有加分号
查看>>
android Intent类
查看>>