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. PHP实现取得HTTP请求的原文【转】

    本文实例讲述了PHP实现取得HTTP请求的原文的方法,具体步骤如下: 1. 取得请求行:Method.URI.协议 可以从超级变量$_SERVER中获得,三个变量的值如下: $_SERVER['REQ ...

  2. Java类成员之代码块

    代码块含义:使用{ }括起来的代码 代码块类型: 1.局部代码块:定义在方法体中. 2.构造代码块:也叫初始化代码块,定义在类中方法体之外. 3.静态代码块:定义在类中方法体之外,被static修饰符 ...

  3. 我是如何做到springboot自动配置原理解析

    一前言 springboot 2.0.0版本分析,整体的自动配置流程如下: 具体配置参考官方文档:springboot-doc 二 @SpringBootApplication 核心注解@Spring ...

  4. 容器环境的JVM内存设置最佳实践

    Docker和K8S的兴起,很多服务已经运行在容器环境,对于java程序,JVM设置是一个重要的环节.这里总结下我们项目里的最佳实践. Java Heap基础知识 默认情况下,jvm自动分配的heap ...

  5. KVM虚拟化基础

    关于虚拟化 什么是虚拟化 在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU.内存.磁盘空间.网络适配器等),予以抽象. ...

  6. Java入门 - 导读

    原文地址:http://www.work100.net/training/java 更多教程:光束云 - 免费课程 Java入门 Java 是由 Sun Microsystems 公司于1995年5月 ...

  7. 去除空白字符串trim

    let str = ' foo ' //去除开头空格 console.log(str.trimLeft()) console.log(str.trimStart()) //去除尾部空格 console ...

  8. XML学习笔记——关于XML解析器

    本篇文章基于W3C而写 在Firefox及其他浏览器中的XML解析器(除IE) var xmlDoc=document.implementation.createDocument("&quo ...

  9. 机器学习- Sklearn (交叉验证和Pipeline)

    前面一节咱们已经介绍了决策树的原理已经在sklearn中的应用.那么这里还有两个数据处理和sklearn应用中的小知识点咱们还没有讲,但是在实践中却会经常要用到的,那就是交叉验证cross_valid ...

  10. java小心机(4)| 继承与组合的爱恨情仇

    在java中,有两种主要复用代码的方法:继承和组合. 继承,是OOP的一大特性,想必大家都非常熟悉了;组合,其实也很常见,只是不知道它的名字罢了. 继承 子类拥有父类的基本特性,需使用extend关键 ...