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)。

  1. 在src/pkg/os/file.go:229中找到Open方法的具体实现,调用了OpenFile;
  2. OpenFile涉及到不同的架构不同实现,unix的实现在src/pkg/os/file_unix.go:65,实际调用了syscall.Open();
  3. 在src/pkg/syscall/syscall_linux.go:21,其实现为sys的open;
  4. sys的实现,实际在src/pkg/runtime/sys_linux_amd64.s:23,汇编语言编写通过真正操作系统层面的syscall实现文件操作;

从以上追溯可以看出:

  1. 核心方法指令,直接调用操作系统层面的syscall,所以规避了很多依赖库;
  2. 核心方法指令,直接调用操作系统层面的syscall,避免了中间商赚差价和冗余实现,编译运行直接高效,可靠性直接挂钩操作系统;
  3. 从src/pkg/runtime的其他文件略读,不少为C的实现,相当于在C的基础上封装,减少了灵活性,提高了效率;

总体而言,Golang是没有C灵活,没有Java丰富,做了一个比较讨喜,适合这个时代的折中。

从Golang中open的实现方式看Golang的语言设计的更多相关文章

  1. mvc中AntiForgeryToken的实现方式--看Mvc源码

    通过 AntiForgeryWorker的GetHtml()方法生成html --input hide元素--value=要验证的值,并生成cookie--用于保存需要验证的值. 类中的AntiFor ...

  2. golang中的socket编程

    0.1.索引 https://waterflow.link/articles/1664591292871 1.tcp的3次握手(建立连接) 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当 ...

  3. Golang 中操作 Mongo Update 的方法

    Golang 和 MongoDB 中的 ISODate 时间交互问题 2018年02月27日 11:28:43 独一无二的小个性 阅读数:357 标签: GolangMongoDB时间交互时间转换 更 ...

  4. 在Golang中使用C语言代码实例

    转自:http://www.jb51.net/article/56720.htm cgo 使得在 Golang 中可以使用 C 代码. Hello World 为了有一个较为直观的了解,我们来看一个简 ...

  5. Golang中WaitGroup使用的一点坑

    Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...

  6. google的grpc在golang中的使用

    GRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x. 前面写过一篇golang标准库的rpc包的用法,这篇文章接着讲一 ...

  7. golang中Context的使用场景

    golang中Context的使用场景 context在Go1.7之后就进入标准库中了.它主要的用处如果用一句话来说,是在于控制goroutine的生命周期.当一个计算任务被goroutine承接了之 ...

  8. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...

  9. 【荐】详解 golang 中的 interface 和 nil

    golang 的 nil 在概念上和其它语言的 null.None.nil.NULL一样,都指代零值或空值.nil 是预先说明的标识符,也即通常意义上的关键字.在 golang 中,nil 只能赋值给 ...

随机推荐

  1. Tensorflow内存暴涨问题

    1.目前只总结出两条 创建saver实例saver = tf.train.Saver()放在循环外面 不循环初始化变量 sess.run(tf.global_variables_initializer ...

  2. QuartzCore

    QuartzCore 说起QuartzCore不知道有多少小伙伴很容易和Quartz2D.CoreGraphics等混淆在一起傻傻分不清楚?所以在下面我们先把这几个很容易混淆或者是分不清楚的框架稍加整 ...

  3. 《深入浅出话数据结构》系列之什么是B树、B+树?为什么二叉查找树不行?

    本文将为大家介绍B树和B+树,首先介绍了B树的应用场景,为什么需要B树:然后介绍了B树的查询和插入过程:最后谈了B+树针对B树的改进. 在谈B树之前,先说一下B树所针对的应用场景.那么B树是用来做什么 ...

  4. 如何设计一个优雅的RESTFUL的接口

    show me the code and talk to me,做的出来更要说的明白 我是布尔bl,你的支持是我分享的动力! 一 .引入 设计接口是我们开发人员的日常操作.当我们把接口交给前端人员时, ...

  5. pom文件继承与聚合

    1.简介 pom.xml文件是Maven进行工作的主要配置文件.在这个文件中我们可以配置Maven项目的groupId.artifactId和version等Maven项目必须的元素:可以配置Mave ...

  6. 第二阶段冲刺个人任务——seven

    今日任务: 整体运行测试上传到公网上的程序. 昨日成果: 搭建网络服务器,上传数据库及程序.

  7. Client API Object Model - Form Context

    FormContext 提供界面或者界面上控件的的引用. 比如说 quick view control, row in an editable grid 等等. Xrm.Page 和 getFormC ...

  8. Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列

    内容目录: Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko S ...

  9. http--->http缓存机制系统梳理

    http缓存 HTTP请求的过程 从在浏览器地址栏敲入域名-DNS解析-实际IP-(中间可能多个代理服务器分发)- 源服务器,请求抵达源服务器后,在服务器上找到请求的资源,再通过代理服务器一层层的返回 ...

  10. centos7+ docker 实践部署docker及配置direct_lvm

    转载于博客园:http://www.cnblogs.com/Andrew-XinFei/p/6245330.html 前言 Docker现在在后端是那么的火热..尤其当笔者了解了docker是什么.能 ...