前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >闻道Go语言,6月龄必知必会

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

作者头像
有态度的马甲
发布2022-12-21 13:59:38
4390
发布2022-12-21 13:59:38
举报
文章被收录于专栏:精益码农精益码农

大家好,我是马甲哥,

学习新知识, 我的策略是模仿-->归纳--->举一反三,

在同程倒腾Go语言一年有余,本次记录《闻道Go语言,6月龄必知必会》,形式是同我的主力语言C#做姿势对比。

1. 宏观预览

1.1 常见结构对比

某些不一定完全对标,实现方式、侧重点略点差异。

go语言

---

C#语言

---

module

assembly

pkg

go get github.com/thoas/go-funk

package

Install-Package Masuit.Tools.Core

struct

class

pointer

reference

net/http

web脚手架、 httpclient

ASP.NETCore、httpclient

net/http/DefaultServeMux

ASP.NETCore脚手架路由

goroutine

异步任务、 async/await

channel

CSP

TPL data flow

CSP模型在C#并非主流

pointer

reference

context

timeout、 cancellation-token

1.2 访问级别

go语言使用[首字母大小写]来体现公开/私有, 应用到package struct function; C#显式使用关键字来体现。

1.3 类型初始化

go语言有两初始化的内置关键字

  • • new : 用于分配内存(带内存零值),返回指针。 eg: new(int), new(Cat)
  • • make :只用于slice、map、 channel 引用类型的初始化。

C#基础类型使用字面量, 引用类型使用new关键字。

2. 编码逻辑结构

2.1 顺序

这没什么好说的,都是至上而下, 遇到函数进函数堆栈。 go语言每行代码后不需要加分号;C#语言每行代码后需要加分号。 go对于括号的使用有要求:斜对称, C#无要求。

2.2 分支
if --- elseif --- else

go和C#语言基本是一样的

代码语言:javascript
复制
- go语言else if、 else 不允许换行,C#对此无要求。
- C#要求[使用括号包围]条件判断语句。
switch -- case [break]
代码语言:javascript
复制
- go语言case语句默认都加上了break,加不加都一样,满足当前case,执行完就会跳出当前switch, 不会一直case下去;
- C#语言执行分支需要主动break, 若没有break,表示共用可用的执行体。
2.3 循环
  • • go语言只有for循环,C#还有while, do while

使用for来体现while/do while

3. 面向对象

封装 抽象 继承 多态

同样是面向对象编程语言,go用结构体来体现,C#常用类来体现。

封装

通常go语言基于结构体、接收者函数来[封装/提炼]事物和行为。

  • • 接收者函数分为:值接收者函数、指针接收者函数。
  • • 两种都能体现封装, 但[指针接收者函数]内的操作变动会体现到入参。
  • • 不管是值,还是指针,都能调用指针接收者函数/值接收者函数,效果还是如上一点一致。

C# 显式使用Class struct等结构来封装数据和行为。

抽象 + 继承

go语言没有抽象函数、抽象类的说法,有接口抽象 和父子类继承关系。

接口将具有共性的方法放在一起,其他任何类型只要实现了这些方法就是实现了接口,俗称鸭子模式。

C#具备语义化的继承/抽象/多态, 显式继承。

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关键字可用在函数、属性、构造函数、代码块。

5. goroutine vs async-await

表象
  • • goroutine由go的原生函数生成,只要前面加上go的语法关键字go(可以有形参,返回值会被忽略)。
  • • await/async语法糖,简化了异步编程的姿势;实际会被编译器翻译成一个状态机。

goroutine是在runtime级别深度内置, async-await是在CLR之上基于C#语言存在。

核心对比

首先要知道:线程是cpu调度的基本单位,不管是goroutine还是async-wait机制都是在尝试提高[cpu调度线程的效率]。

  • • go在os内核线程之上,原生支持了轻量级的用户态线程goroutine,堆栈很小,开销很小,(存在一个用户态逻辑处理器给线程投喂goroutine)。
  • • C#编译器生成的状态机,转化并管控基于线程池线程的主调任务、异步任务、后继任务

两者支持并发的思路有明显差异:

go: 内核态线程切换开销大,故原生提供用户态线程,开销极小,天然支持高并发,且不轻易坠落到内核态, 是一个革命派的思路。

C#:async-await针对线程做辗转腾挪,高效利用, 是一个改良派的思路。

异步

都具备异步的能力,go语言没有await的概念,goroutine在等待通道读操作时[挂起自身,并将OS线程释放给另一个goroutine], 跟C#执行时遇到await关键字的行为效果是一样的。

推荐附加阅读

  • • https://grantjam.es/concurrency-comparing-golangs-channels-to-c-sharps-asyncawait/
  • • https://techstacks.io/posts/6628/go-vs-csharp-part-1-goroutines-vs-async-await

本文限于篇幅,只记录了go语言和C#语言的入门6月龄的核心差异点和重难点,高手轻喷,也欢迎指出问题,后续会不断完善月龄数据, 请有心人持续关注左下角原文, 如果能一键三连更是莫大的鼓励。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 宏观预览
    • 1.1 常见结构对比
      • 1.2 访问级别
        • 1.3 类型初始化
        • 2. 编码逻辑结构
          • 2.1 顺序
            • 2.2 分支
              • if --- elseif --- else
                • switch -- case [break]
                  • 2.3 循环
                  • 3. 面向对象
                    • 封装
                      • 抽象 + 继承
                      • 4. 指针 vs 引用
                      • 5. goroutine vs async-await
                        • 表象
                          • 核心对比
                            • 异步
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档