当前位置: 首页 > news >正文

Go语言学习04~05 函数和面向对象编程

Go语言学习04-函数

函数是一等公民

<font color="Blue">与其他主要编程语言的差异</font>

  1. 可以有多个返回值
  2. 所有参数都是值传递: slice, map, channel 会有传引用的错觉
  3. 函数可以作为变量的值
  4. 函数可以作为参数和返回值

学习函数式编程

可变参数

func sum(ops ...int) int {s := 0for _, op := range ops {s += op}return s
}

defer 函数

func TestDefer(t *testing.T) {defer func() {t.Log("Clear resources")}()t.Log("Started")panic("Fatal error") // defer仍会执行
}

Go语言学习05-面向对象编程

Go语言官方对于Go 语言是否为面向对象编程的描述https://golang.org/doc/faq:

Is Go an object-oriented language?

Yes and no. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy. The concept of “interface” in Go provides a different approach that we believe is wasy to use and in some ways more general.

Also, the lack of a type hierarchy makes “objects” in Go fell much more lightweight than in language such as C++ or Java.

封装数据和行为

结构体定义
type Employee struct {Id stringName stringAge int
}
实例创建及初始化
e := Employee{"0", "Bob", 20}
e1 := Employee{Name: "Mike", Age:30}
e2 := new(Employee)		// 注意这里返回的引用/指针, 相当于 e:=&EmployeeP{}
e2.Id = "2"				// 与其他编程语言的差异: 通过实例的指针访问成员不需要->
e2.Age = 22
e2.Name = "Rose"
行为 (方法) 定义
// 第一种定义方式在实例对应方法被调用时, 实例的成员会进行值复制
func (e Employee) String() string {return fmt.Sprintf("ID:%s-Name:%s-Age:%d", e.Id, e.Name, e.Age)
}// 通常情况下为了避免内存拷贝我们使用第二种定义方式
func (e *Employee) String() string {return fmt.Sprintf("ID:%s-Name:%s-Age:%d", e.Id, e.Name, e.Age)
}

接口与依赖

«interface»
A
AImpl
AClient
// Programmer.java
public interface Programmer {String WriteCodes();
}// GoProgrammer.java
public class GoProgrammer implements Programmer{@Overridepublic String WriteCodes() {return "fmt.Println(\"Hello World!\")";}
}// Task.java
public class Task {public static void main(String[] args) {Programmer prog = new GoProgrammer();String codes = prog.WriteCodes();System.out.printlv(codes);}
}

Duck Type式接口实现

接口定义
type Programmer interface {WriteHelloWorld() Code
}
接口实现
type GoProgrammer struct {
}func (p *GoProgrammer) WriteHelloWorld() Code {return "fmt.Printlv(\"Hello World!\")"
}

Go 接口

与其他主要编程语言的差异

  1. 接口为非入侵性, 实现不依赖于接口定义
  2. 所以接口的定义可以包含在接口使用者包内

接口变量

自定义类型

  1. type IntConvertionFn func(n int) int
  2. type Mypoint int

多态

空接口与断言

  1. 空接口可以表示任何类型

  2. 通过断言来将空接口转换为指定类型

    v, ok := p.(int)   //ok = true 时为转换成功
    

Go 接口最佳实践

  • 倾向于使用小的接口定义, 很多接口只包含一个方法

    type Reader interface {Read(p []byte) (n int, err int)
    }type Writer interface {Write(p []byte) (n int, err int)
    }
    
  • 较大的接口定义, 可以由多个小接口定义组合而成

    type ReadWriter interface {ReaderWriter
    }
    
  • 只依赖于必要功能的最小接口

    func StoreData(reader Reader) error {...
    }
    

相关文章:

  • c++算法学习笔记 (15) 质数
  • 新手如何入门电子电路
  • 我的VSCode配置和常见插件
  • 探秘开源隐语:架构深度剖析与隐私计算技术之旅
  • 解读 Xend Finance:向 RWA 叙事拓展,构建更具包容性的 DeFi 体系
  • c++类型转换(持续更新)
  • 七仔充电桩平台 二轮电动自行车 四轮汽车 云快充1.5 云快充1.6
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • 点云从入门到精通技术详解100篇-点云采样理论知识详解
  • C# 右键快捷菜单(上下文菜单)的两种实现方式
  • 数据结构——循环队列的实现
  • 【嵌入式硬件】步进电机
  • QT网络编程之实现UDP广播发送和接收(多网卡,多IP)
  • Spring常用设计模式-实战篇之单例模式
  • vue父子组件生命周期
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【翻译】babel对TC39装饰器草案的实现
  • Apache的基本使用
  • HashMap剖析之内部结构
  • mongo索引构建
  • Next.js之基础概念(二)
  • PV统计优化设计
  • windows下mongoDB的环境配置
  • 对JS继承的一点思考
  • 一、python与pycharm的安装
  • 一个完整Java Web项目背后的密码
  • FaaS 的简单实践
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (06)金属布线——为半导体注入生命的连接
  • (2)nginx 安装、启停
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (四)Android布局类型(线性布局LinearLayout)
  • .gitignore
  • .gitignore文件_Git:.gitignore
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • /bin/rm: 参数列表过长"的解决办法
  • @angular/cli项目构建--http(2)
  • @RestControllerAdvice异常统一处理类失效原因
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [20150629]简单的加密连接.txt
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [APIO2015]巴厘岛的雕塑
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [GXYCTF2019]BabySQli1
  • [JS] node.js 入门
  • [LeetCode 687]最长同值路径
  • [LeetCode]—Anagrams 回文构词法
  • [office] 在Excel2010中设定某些单元格数据不参与排序的方法介绍 #其他#知识分享#笔记
  • [ORM]register db Ping `default`, Error 1130: Host '' is not allow connect to this MySQL server
  • [PyTorch][chapter 60][强化学习-2-有模型学习2]