从Golang中open的实现方式看Golang的语言设计
Golang有很多优点:
- 开发高效;(C语言写一个hash查找很麻烦,但是go很简单)
- 运行高效;(Python的hash查找好写,但比Python高效很多)
- 很少的系统库依赖;(环境依赖少,一般不依赖各种LibPath等)
- 简单可依赖;(静态类型,不怕Python的动态类型防不胜防的坑;unused import会报错,减少不必要的import;)
- 可以直接嵌C,也可以编译成so供C/C++调用;(搞不定的坑都可以让C来填;高效的部分golang刷刷刷)
开发高效 VS 运行高效
一般情况下,开发高效需要有丰富的表达、高级的功能、智能的调度;运行高效,需要又简洁的逻辑、明确且直接的指令。
丰富的表达 VS 表达转换和优化,需要冗余的支撑,包含庞杂的兼容,简单的使用背后是复杂和圈圈绕绕的逻辑,成千上万的指令,严重影响效率;
如果我需要达成golang的优点,解决其中的矛盾,该怎么做呢?无非是开源节流,或者找到一种和谐的划分,既丰富包容又简单高效
- 节流
- 减少中间层级;(降低转换次数,减少中间商赚差价)
- 表达路径优化;(降低表达的丰富性、减少冗余实现的可能,比如open只有一种实现方法,所有用刀open的都这么用)
- 严格的语法逻辑,尽量少的语法糖 (减少表达的语法解析,限制横向冗余可能性)
- 更优的调用层次划分,尽量减少同一功能的冗余低效实现 (减少表达的纵向冗余可能性)
- 开源(一定程度降低丰富性,提升效率,把丰富性的空间留给上层)
- goroutine的协程调度,从有限的线程资源和并发间隙中挖掘可能性
- map和channel等一些基础设定,从语言要素角度,找到降低丰富性,但是强大又高效(既开发高效,也运行高效)的点
Golang的语言设计
首先Golang是一种编译型语言,从code编译链接后是机器码。C、C++都是这样的,我们不得不想到GCC。
GCC,GNU Compiler Collection;GUN,GNU's Not Unix。
GNU是自由的操作系统,GCC是自由操作系统都编译器集合,Golang确实也是GCC中断一个Option。
我们常用的Golang两种编译器:gc(Golang Compiler);gccgo Compiler。
- gccgo是符合GCC标准的compiler,支持GCC的很多Option
- gc并不完全符合GCC标准
Golang的语法和功能都是要通过Compiler编译链接实现的,这些都可以在go main和gccgo的源码中找到答案。
比如os.Open()是我们常用的一个方法,这里我们以go1版本的代码去研究unix上amd64架构的实现:commit 6174b5e21e73714c63061e66efdbe180e1c5491d (HEAD, tag: go1)。
- 在src/pkg/os/file.go:229中找到Open方法的具体实现,调用了OpenFile;
- OpenFile涉及到不同的架构不同实现,unix的实现在src/pkg/os/file_unix.go:65,实际调用了syscall.Open();
- 在src/pkg/syscall/syscall_linux.go:21,其实现为sys的open;
- sys的实现,实际在src/pkg/runtime/sys_linux_amd64.s:23,汇编语言编写通过真正操作系统层面的syscall实现文件操作;
从以上追溯可以看出:
- 核心方法指令,直接调用操作系统层面的syscall,所以规避了很多依赖库;
- 核心方法指令,直接调用操作系统层面的syscall,避免了中间商赚差价和冗余实现,编译运行直接高效,可靠性直接挂钩操作系统;
- 从src/pkg/runtime的其他文件略读,不少为C的实现,相当于在C的基础上封装,减少了灵活性,提高了效率;
总体而言,Golang是没有C灵活,没有Java丰富,做了一个比较讨喜,适合这个时代的折中。
从Golang中open的实现方式看Golang的语言设计的更多相关文章
- mvc中AntiForgeryToken的实现方式--看Mvc源码
通过 AntiForgeryWorker的GetHtml()方法生成html --input hide元素--value=要验证的值,并生成cookie--用于保存需要验证的值. 类中的AntiFor ...
- golang中的socket编程
0.1.索引 https://waterflow.link/articles/1664591292871 1.tcp的3次握手(建立连接) 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当 ...
- Golang 中操作 Mongo Update 的方法
Golang 和 MongoDB 中的 ISODate 时间交互问题 2018年02月27日 11:28:43 独一无二的小个性 阅读数:357 标签: GolangMongoDB时间交互时间转换 更 ...
- 在Golang中使用C语言代码实例
转自:http://www.jb51.net/article/56720.htm cgo 使得在 Golang 中可以使用 C 代码. Hello World 为了有一个较为直观的了解,我们来看一个简 ...
- Golang中WaitGroup使用的一点坑
Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...
- google的grpc在golang中的使用
GRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x. 前面写过一篇golang标准库的rpc包的用法,这篇文章接着讲一 ...
- golang中Context的使用场景
golang中Context的使用场景 context在Go1.7之后就进入标准库中了.它主要的用处如果用一句话来说,是在于控制goroutine的生命周期.当一个计算任务被goroutine承接了之 ...
- Golang中的自动伸缩和自防御设计
Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...
- 【荐】详解 golang 中的 interface 和 nil
golang 的 nil 在概念上和其它语言的 null.None.nil.NULL一样,都指代零值或空值.nil 是预先说明的标识符,也即通常意义上的关键字.在 golang 中,nil 只能赋值给 ...
随机推荐
- String类方法的使用
String类的判断功能: boolean equals(Object obj) //比较字符串内容是否相同(区分大小写). boolean equalsIgnoreCase(String str) ...
- .Net Core使用分布式缓存Redis:Lua脚本
一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用L ...
- 发布到远程存储库时遇到错误: Git failed with a fatal error.
正在推送 master发布到远程存储库时遇到错误: Git failed with a fatal error.Authentication failed for 'http://1212121xxx ...
- Python解析json字符串,json字符串用法
json数据简介 json数据是一个轻量级的数据交换格式,采用完全独立于语言的文本格式,这些特性使json称为理想的数据交换语言,易于人阅读和编写,同时易于机器解析和生成. json中的字符集必须是U ...
- Djaingo 随机生成验证码(PIL)
基础: https://www.cnblogs.com/wupeiqi/articles/5812291.html 实例: https://www.cnblogs.com/6324TV/p/88112 ...
- Java入门 - 语言基础 - 04.对象和类
原文地址:http://www.work100.net/training/java-object-class.html 更多教程:光束云 - 免费课程 对象和类 序号 文内章节 视频 1 概述 2 J ...
- visul studio 使用git扫盲帖。
写给和一样的菜B 有必要知道的命令: git rm --cached (文章底部有git命令大全) 创建.gitignore文件 windows版: 在项目根目录下面创建gitignore.txt文件 ...
- Python-直接存储类实例作为序列的元素
如果我们需要存储的数据有很多属性,并且存储的数量很多,可选择定义一个类来表示数据类型,而类的实体作为单个的成员进行存储,这样做的好处是可以只存储一个容器,而不需要每次都存储大量的数据,并且可以限制对数 ...
- 机器学习环境配置系列六之jupyter notebook远程访问
jupyter运行后只能在本机运行,如果部署在服务器上,大家都希望可以远程录入地址进行访问,这篇文章就是解决这个远程访问的问题.几个基本的命令就可以搞定,然后就可以愉快的玩耍了. 1.安装jupyte ...
- 使用整体模型模板辅助器 Using Whole-Model Templated Helpers 模板辅助器方法 精通ASP.NET MVC 5
怎么会