闻道Go语言,6月龄必知必会

大家好 , 我是马甲哥,
学习新知识,我的策略是模仿-->归纳--->举一反三,
在同程倒腾Go语言一年有余,本次记录《闻道Go语言 , 6月龄必知必会》,形式是同我的主力语言C#做姿势对比 。

闻道Go语言,6月龄必知必会

文章插图
1. 宏观预览1.1 常见结构对比
某些不一定完全对标,实现方式,侧重点略点差异 。
go语言---C#语言---moduleassemblypkggo get github.com/thoas/go-funkpackageInstall-Package Masuit.Tools.Corestructclasspointerreferencenet/httpweb脚手架、 httpclientASP.NETCore、httpclientnet/http/DefaultServeMuxASP.NETCore脚手架路由goroutine异步任务、 async/awaitchannelCSPTPL data flowCSP模型在C#并非主流contexttimeout、cancellation-token1.2 访问级别go语言使用[首字母大小]写来体现公开/私有 ,  应用到package struct function;C#显式使用关键字来体现 。
1.3 类型初始化go语言有两初始化的内置关键字
  • new: 用于分配内存(带内存零值),返回指针new(int), new(Cat)
  • make : 只用于slice、map、 channel 引用类型的初始化
C#基础类型使用字面量,引用类型使用new关键字
2. 编码逻辑结构2.1 顺序这没什么好说的,都是至上而下 ,  遇到函数进函数堆栈 。go语言每行代码后不需要加分号;C#语言每行代码后需要加分号 。go对于括号的使用有要求: 斜对称,C#无要求 。
2.2 分支if --- elseif ---elsego和C#语言基本是一样的
闻道Go语言,6月龄必知必会

文章插图
- go语言else if、 else 不允许换行,C#对此无要求 。- C#要求[使用括号包围]条件判断语句 。switch -- case[break]
闻道Go语言,6月龄必知必会

文章插图
- go语言case语句默认都加上了break,加不加都一样 , 满足当前case,执行完就会跳出当前switch,不会一直case下去;- C#语言执行分支需要主动break,若没有break,表示共用可用的执行体 。2.3 循环
闻道Go语言,6月龄必知必会

文章插图
  • go语言只有for循环 , C#还有while, do while
使用for来体现while/do while
闻道Go语言,6月龄必知必会

文章插图

闻道Go语言,6月龄必知必会

文章插图
3. 面向对象封装抽象 继承 多态
同样是面向对象编程语言,go用结构体来体现,C#常用类来体现 。
闻道Go语言,6月龄必知必会

文章插图
封装通常go语言基于结构体、接收者函数来[封装/提炼]事物和行为 。
  • 接收者函数分为: 值接收者函数、指针接收者函数 。
  • 两种都能体现封装,但[指针接收者函数]内的操作会体现到入参 。
  • 不管是值,还是指针,都能调用指针接收者函数/值对象接受者函数,效果还是如上一点一致 。
C# 显式使用Class struct等结构来封装数据和行为 。
抽象 + 继承go语言没有抽象函数、抽象类的说法,有接口抽象 和父子类继承关系 。
接口将具有共性的方法放在一起,其他任何类型只要实现了这些方法就是实现了接口 , 俗称鸭子模式 。
C#具备语义化的继承/抽象/多态, 显式继承 。
闻道Go语言,6月龄必知必会

文章插图
4. 指针 vs 引用指针指向一个内存地址; 引用指向内存中某个对象 。
一般认为go是C语言的家族 , 但是go的指针弱化了C语言的指针操作,go指针的作用仅操作其指向的对象,不能基于地址这个概念做指针移位 ,  也不能基于地址这个概念做类型转化 。
A value of a pointer type whose base type is T can only store the addresses of values of type T.
go的指针简化了指针的使用,减少了指针出错的概率 。
引用可看做是指针的抽象,也基于code safe的理由,不能在引用上做算术运算和低级别的取巧 。
从这个意义上看,C#的引用等价于go的指针, 都是类型安全的指针 。
另一方面, 两种语言都提供了对内存进行任意读写的姿势(非代码安全) 。
go的unsafe.Pointer本质是一个int指针 。
type Pointer *ArbitraryTypetype ArbitraryType int
C# unsafe关键字可用在函数、属性、构造函数、代码块 。

推荐阅读