闻道Go语言,6月龄必知必会
大家好,我是马甲哥,
学习新知识, 我的策略是模仿-->归纳--->举一反三,
在同程倒腾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关键字的行为效果是一样的。
推荐附加阅读
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月龄的核心差异点和重难点,高手绕道, 后续会不断完善, 请有心人持续关注左下角原文, 如果能点赞更是莫大的鼓励。
闻道Go语言,6月龄必知必会的更多相关文章
- mysql必知必会
春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...
- 2015 前端[JS]工程师必知必会
2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...
- [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)
http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...
- makefile 必知必会
Makefile 必知必会 Makefile的根本任务是根据规则生成目标文件. 规则 一条规则包含三个:目标文件,目标文件依赖的文件,更新(或生成)目标文件的命令. 规则: <目标文件>: ...
- 《MySQL必知必会》[01] 基本查询
<MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...
- mysql必知必会系列(一)
mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...
- 《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 ...
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...
- msql 必知必会笔记
Edit Mysql 必知必会 第一章 理解SQL 什么是数据库 数据库(database) 保存有组织的数据的容器 什么是表 一组特定类型的数据的结构化清单 什么是模式 数据库和表的布局及特性的 ...
随机推荐
- 使用Fiddler劫持网络资源为前端开发助力(示例:Dynamic CRM 表单开发 也能热更新? )
背景: 使用过vue开发的童鞋应该都知道,在开发vue项目的过程中,有个叫"热更新"的功能特别爽,在传统html开发到初次接触vue时,才发现原来前端开发可以这么香.热更新的表现形 ...
- 认识Vue扩展插件
众所周知,在 Vue 开发中,实现一个功能可以有很多种方式可以选择,这依赖于 Vue 强大的功能(指令.混合.过滤.插件等),本文介绍一下插件的开发使用. Vue 插件 插件通常用来为 Vue 添加全 ...
- wbr 文本换行规则标签
<wbr/>标签规定在文本中的何处适合添加换行符.如果文本太长,浏览器可能会在错误的位置换行,那么可以使用<wbr/>标签来添加单词换行时机. Talk is cheap. S ...
- PHP实现服务器文件预览
PHP实现服务器里面的所有文件进行预览跟手机文件夹一样 服务器创建一个index.php文件 点我查看 <?php // errors ini_set('display_errors', 1); ...
- 第八十七篇:Vue动态切换组件的展示和隐藏
好家伙, 1.什么是动态组件? 动态组件指的是动态切换组件的限制与隐藏 2.如何实现动态组件渲染 vue提供了一个内置的<component>组件,专门用来实现动态组件的渲染. 可以将其看 ...
- 安卓平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结
很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型 ...
- SQL CASE语句的使用
SQL CASE语句的使用 CASE是一个控制流语句,其作用与IF-THEN-ELSE语句非常相似,可根据数据选择值. CASE语句遍历条件并在满足第一个条件时返回值. 因此,一旦条件成立,它将短路, ...
- 【HMS Core】集成地图服务不显示地图问题
[问题描述] 关于华为HMS-地图服务不显示地图的问题. 背景:集成华为地图服务运行后页面不显示地图,运行app后不展示地图报错MapsInitializer is not initialized. ...
- ProxySQL 定时调度
转载自:https://www.jianshu.com/p/410ff5897c27 Scheduler是 v1.2.0 引入的特性. ProxySQL的Scheduler是一个类似于定时任务系统(c ...
- kubeoperator升级步骤
当前kubeoperator版本是3.6.0 官方文档:https://kubeoperator.io/docs/installation/install/ # 离线升级需要提前下载离线安装包,并解压 ...