大家好,我是马甲哥,

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

在同程倒腾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#并非主流
context timeout、 cancellation-token

1.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 --- else

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

- go语言else if、 else 不允许换行,C#对此无要求。
- C#要求[使用括号包围]条件判断语句。
switch -- case [break]

- 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 *ArbitraryType

type 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关键字的行为效果是一样的。

推荐附加阅读

本文限于篇幅,只记录了go语言和C#语言的入门6月龄的核心差异点和重难点,高手绕道, 后续会不断完善, 请有心人持续关注左下角原文, 如果能点赞更是莫大的鼓励。

闻道Go语言,6月龄必知必会的更多相关文章

  1. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  2. 2015 前端[JS]工程师必知必会

    2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...

  3. [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)

    http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...

  4. makefile 必知必会

    Makefile 必知必会 Makefile的根本任务是根据规则生成目标文件. 规则 一条规则包含三个:目标文件,目标文件依赖的文件,更新(或生成)目标文件的命令. 规则: <目标文件>: ...

  5. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  6. mysql必知必会系列(一)

    mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...

  7. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  8. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  9. msql 必知必会笔记

    Edit Mysql 必知必会 第一章 理解SQL 什么是数据库 数据库(database) 保存有组织的数据的容器 什么是表  一组特定类型的数据的结构化清单 什么是模式  数据库和表的布局及特性的 ...

随机推荐

  1. 新一代工作流调度-Apache DolphinScheduler 1.3.5 Docker镜像发布

    新一代大数据工作流调度 - Apache DolphinScheduler(incubator) 今天发布了 1.3.5 官方 Docker 镜像.在社区伙伴 chengshiwen 的努力下,  1 ...

  2. NC20242 [SCOI2005]最大子矩阵

    题目链接 题目 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大. 注意:选出的k个子矩阵 不能相互重叠. 输入描述 第一行为n,m,k(1 ≤ n ≤ 100 ...

  3. BZOJ4337 树的同构 (树哈希)(未完成)

    样例迷,没过 交了30pts #include <cstdio> #include <iostream> #include <cstring> #include & ...

  4. SpingBoot解析Excel数据

    前言 在最近的工作中,由于导入模板除了前三列(姓名.手机号.实发工资)固定:其余的列不固定,并且可以做到两个模板的数据都能够正常入库进行对应业务处理. 一.数据模板数据展示: (1)模板一 (2)模板 ...

  5. leetcode之二叉树

    专题:二叉树遍历 987. 二叉树的垂序遍历 给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列. 对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row ...

  6. SpringBoot RabbitMQ 注解版 基本概念与基本案例

    前言 人间清醒 目录 前言 Windows安装RabbitMQ 环境工具下载 Erlang环境安装 RabbitMQ安装 RabbitMQ Web管理端安裝 RabbitMQ新增超级管理员 Rabbi ...

  7. Javascript之异步循环打印这道小题

    这道题,我相信很多前端从业者都知道,它本质上来说并不复杂,但是却可以有很深远的扩展,最终核心的主题其实就是异步的遍历,其中对于题目的初级解法,还涉及到一些作用域的知识.那么我们以最容易理解的解法入手, ...

  8. SpringBoot_事务总结

    Springboot 事务 1. 打印SQL 日志的两种配置方式 [1]通过配置包的log等级来打印SQL日志,但这种不会打印出事务日志 logging.level.com.grady.mybatis ...

  9. [Python]-sklearn.model_selection模块-处理数据集

    拆分数据集train&test from sklearn.model_selection import train_test_split 可以按比例拆分数据集,分为train和test x_t ...

  10. 【Java面试】面试遇到宽泛的问题,这么回答就稳了,谈谈你对Redis的理解

    "谈谈你对Redis的理解"! 面试的时候遇到这类比较宽泛的问题,是不是很抓狂? 是不是不知道从何开始说起? 没关系,今天我用3分钟教你怎么回答. 大家好,我是Mic,一个工作了1 ...