fabric go sdk 依赖的安装_从这些角度看 Go 是一门很棒的语言

Go 当前引起了很多关注。让我们看一下 Go 好的部分。

f411d7df2a736ef7b19f085be52a0b5b.png

我最近用 Go 写了一个 SSH 服务器[1],在其中启动容器。该项目已经发展到很大规模,并且我向 Go 发起了 PR[2],以修复我发现的错误。在积累了比 “Hello world!” 更多的经验之后,现在我有信心写出我真正喜欢的 Go 语言部分。

跨平台

Go 引起我注意的原因之一是其构建系统。Java 的最初承诺是它是跨平台的,但是它需要安装运行时的事实显然是一个失败。而 Go 编译为本地二进制文件。在 Windows 上,您将获得一个 .exe 文件,在 Linux 上,您将获得一个 ELF 二进制文件,依此类推。而且,除非您使用 cgo,否则 Go 程序可以在几乎没有外部依赖的情况下运行。无需安装任何 .dll 或 .so 文件,Go 程序即可直接使用[3]

大部分时候,除了某些函数需要 libc 外,Go 程序可以在完全没有外部依赖的情况下运行。

Go 可以用来构建真正的跨平台二进制文件而无需安装笨拙的运行时(例如使用 Java 或 Python),这一事实是 Go 的主要吸引点。

Goroutines 和 Channels

当我开始使用 Go 语言时,我意识到它对并发的处理是多么的酷。传统上,您将使用线程或单独的进程来同时运行多个任务(例如 Java,C,C ++)。另外,您也可以依靠协作式多任务处理(例如 Javascript)来达到相同的效果。

对于线程和进程,操作系统必须执行的每个切换都会造成资源损耗。这称为上下文切换。换句话说,一个使用大量线程的粗心程序员将带来性能问题。

另一方面,协作多任务将在单个线程上运行。每当一项任务必须等待某件事时,另一项任务就会运行。如果一个任务占用了 CPU,其他任务将被饿死。

Go 以巧妙的方式将两者结合在一起。让我们以以下示例为例:

func main() {    go someOtherFunction()}

注意 go 关键字。通过使用此关键字,someOtherFunction() 可在 goroutine 中运行。想象一下 Go 作为线程池处理并发的方式。每当您运行 goroutine 时,它将在这些线程之一中运行。这样 Go 可以优化线程的使用以提高性能。

为了促进 goroutine 之间的数据传输,Go 引入了通道(channel),通道是应用程序中的消息队列,用于发送数据。

func main() {    chan done 

从上面的代码中可以看到,

如果您对更多细节感兴趣,请查看 channel[4]上下文[5]互斥锁[6]

指针,Defer 和垃圾收集

当提到指针时,首先想到的是 C 或 C++。通常,这种记忆并不愉快。

在 Go 中,指针更像是引用。指针并非总是将数据复制到变量中,而是指向原始的内存。不管传递包含指针的变量多少次,任何修改都将始终更改原始值。

让我们看一个例子:

someVar := &someStruct{}

现在,变量包含指向该结构的指针。传递时,无论您复制指针多少次,它始终指代相同的内存空间。

但是,与 C 指针不同,Go 指针在不再需要时会自动进行垃圾回收。您无需担心使用后释放或缓冲区溢出漏洞,这些在 Go 中都不是问题。太棒了!

此外,您还可以使用 defer 语句来帮助您进行函数清除。考虑以下函数:

func foo() error {    close := func() {        // Do somehing to clean up stuff    }    err := doSomething()    if err != nil {        close()        return err    }    // Do something else    close()}

如您所见,我们在此函数中调用了 close() 两次。如果 foo 函数有多个出口(返回),则需要为每个出口重复 close() 调用。

defer 语句完全可以解决此问题:

func foo() error {    close := func() {        // Do somehing to clean up stuff    }    defer close()    err := doSomething()    if err != nil {        return err    }    // Do something else}

defer 语句保证 close 总是会被调用。

多返回值

这看似没什么,但是在编程语言中却很少见。

sshConn, chans, reqs, err := ssh.NewServerConn(tcpConn, config)

有什么理由不喜欢?

OOP(好的部分)

尽管 Go 没有类的概念,但仍然可以编写面向对象的代码。

假设有以下 Java 代码:

class TreeNode {    private List nodes = new ArrayList();    public void addChild(child TreeNode) {        nodes.add(child)    }}

在 Go 中,类似的代码如下所示:

type TreeNode struct {    children []treeNode}func New() *TreeNode {    return &TreeNode{}}func (treeNode *TreeNode) AddChild(child * TreeNode) {    treeNode.children = append(treeNode.children, child)}

Go 将(treeNode *TreeNode)部分称为接收器。Go 中的 Receiver 可以使用与其他语言中的 this 关键字非常相似的任何数据类型和功能。

Slices

和许多其他低级语言一样,Go 将数组实现为固定大小的元素列表。创建后无法更改其大小。

另一方面,切片(Slice)是使它们动态化的技巧。当切片已满时,Go 会创建一个更大的切片新副本。Go 以尽可能少的复制的方式优化过程。

此外,Go slice 还具有创建不占用额外内存的子切片的简洁功能。这些切片引用原始的数组。如果更改切片中的数据,则原始数据也将更改。

import "fmt"func main() { data := []string{"a", "b", "c", "d"} d := data[2:3] // Will print [c] fmt.Printf("%v", d) d[0] = "f" //Will print [a b f d] fmt.Printf("%v", data)}

如果您想深入了解,请继续阅读 Go by Example[7]

选择 Go 的原因之一是库数量众多。SSH 客户端和服务器库?有[8]。适用于 AWS 的 SDK?同样有[9]。GitHub 操作库?当然有[10]。让我们尝试一些非常少用的东西……FastCGI 协议实现如何?当然也有[11]

我可以继续,但是没多大必要了。Go 的普及无疑对生态系统有所帮助。

工具

构建 Go 拥有大量可用的工具。您拥有从自动代码格式化[12],测试到完整发布工具[13]的全套工具。几乎所有的都有很多工具。

结论

在代码组织方面,Go 当然有其缺点。但是,它特别适合用于各种任务的高性能软件开发。

那 Go 具体有哪些缺点呢?下次我们“喷一喷” Go 的缺点。

原文链接:https://pasztor.at/blog/go-is-awesome

编译:polaris

参考资料

[1]

SSH 服务器: https://github.com/janoszen/containerssh

[2]

发起了 PR: https://go-review.googlesource.com/c/crypto/+/236517

[3]

直接使用: https://www.youtube.com/watch?v=YPN0qhSyWy8

[4]

channel: https://gobyexample.com/channels

[5]

上下文: https://gobyexample.com/context

[6]

互斥锁: https://gobyexample.com/mutexes

[7]

Go by Example: https://gobyexample.com/slices

[8]

有: https://godoc.org/golang.org/x/crypto/ssh

[9]

同样有: https://aws.amazon.com/sdk-for-go/

[10]

当然有: https://github.com/google/go-github

[11]

当然也有: https://golang.org/pkg/net/http/fcgi/

[12]

自动代码格式化: https://blog.golang.org/gofmt

[13]

完整发布工具: https://goreleaser.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序win10_win10该文件没有与之关联的程序来执行操作

当初我遇到这个问题的时候,也是一脸懵!在度娘那里尝试了许多种方法,都没有得到解决!那些方法我就不一一介绍了,百度一大堆!下面就来分享一下我解决的办法!1.打开默认程序2.找到设置程序访问和计…

node工程默认url_node 爬虫入门实例,简单易懂

前言本文介绍一个 koa 的爬虫项目,受众对象为初学前端不久的小伙伴,通过这个项目能对 node 爬虫有一个简单的认识,也能自己动手写一些简单的爬虫。项目地址:Fe-Icy/firm-spider​github.com启动 koa 服务Koa (koajs) -- 基于 Node…

xshell6 不更新无法使用_世纪金花商联卡无法正常使用 客服:因门店面临改造,涉及品牌、规则每天都在更新...

有效期10年、无消费限制的世纪金花商联卡在半年前开始无法正常使用,11月22日,世纪金花赛高店内200多个零售品牌,只有一个品牌可以无金额限制地正常使用商联卡,世纪金花各门店每日可使用的品牌数量、规则都在变化,什么时…

linux ls 中文乱码_每天一个linux命令:Linux文件类型与扩展名

Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如file.txt、file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文件类型中衡量的话,大多是常规文件(也被称为普通文件&…

linux中cooy命令_Linux:CentOS 7中常用的基础命令

对于学习Linux系统来说,命令是必须熟练掌握的第一个部分。Linux系统中的命令有600多个,但常用的基础命令并不多。虽然不同版本的Linux系统的命令稍有不同,但命令的语法与使用方法基本相同,因此读者只要掌握了CentOS 7中常用的基础…

730阵列卡支持多大硬盘_3分钟告诉你:OPPO Reno普通版和旗舰版的差距到底有多大...

昨天OPPO正式发布了Reno系列手机:分为标准版和旗舰版两款。宣传普通版的售价和旗舰版的卖点是手机厂商一贯的传统。为了搞清楚普通版和旗舰版的差距到底有多大,今天我和大家一起扒一扒这两款手机之间的区别到底有多大,供大家在选机时做一个参…

查看list的形状_用Wordcloud生成指定形状的词云图

wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式,通过词云生成的图片,我们可以更加直观的看出某篇文章的故事梗概。首先贴出一张词云图(以哈利波特小说为例):在生成词云图之前,首先要做一些准备工作1.安装结巴分词库…

oc引导win方法_[OC更新]机械革命8代、9代标压稳定版更新

加关注这种话银家怎么好意思说出口嘛更新机型机械革命Z2G机械革命Z2AIRG机械革命X3(9th ver)机械革命umi air(1080p ver)机械革命X9TI机械革命X8TI-R机械革命X8TI-G机械革命Z2机械革命Z2AIR机械革命X8TI机械革命X8TI PLUS机械革命X3(8th ver)机械革命S1PLUS(8750H)机械革命X2更…

有机晶体数据库_Cambridge Structural Database 2017 晶体结构分析软件分享

文 / 利刃君微信ID / ziyuanliren666全文共2024字,推荐阅读时间6分钟。剑桥结构数据库系统(The Cambridge Structural Database System,简写为CSDS)是基于X光和中子衍射实验唯一的小分子及金属有机分子晶体的结构数据库,收录了全世界范围内所…

win ftp 指定的密码无效。请键入新密码。_重设OS X (macOS)系统帐户密码的5种方法...

为了保护自己的隐私安全,不少 Mac 用户都会选择给自己的设备设置密码,但是时不时的会出现忘掉密码的情况。分享找回(重设)OS X (macOS)系统账号密码的5种方法。如果你忘记了 OS X (macOS&#x…

滑动翻页效果_Flutter实现3D效果,一个字,炫!

老孟的博客地址:http://laomengit.com/Flutter 中3D效果是通过Transform组件实现的,没有变换效果的实现:class TransformDemo extends StatelessWidget {overrideWidget build(BuildContext context) {return Scaffold( appBar: AppBar(…

MySQL8怎么设置时区为东八区_mysql时区设置为东八区

场景:后台返回给页面的时间统一差8小时。 分析:差八小时,应该是时区问题。具体的是哪一层出的问题呢,mybatis?mysql?系统时间? 解析: 1.查询mysql时区(正常) 输入show variables like "%time_zone%";,显示当前时区 全局参数system_time_zone 系统时区,在My…

mysql网络异常_mysql运行过程中因网络或者数据库原因导致的异常

1、异常信息:The driver has not received any packets from the server异常栈:原因:此异常为jdbc自身的超时限制,一般为应用调用jdbc的API设置了queryTimeout超时限制,当成功获取数据库连接执行sql的时候与mysql服务端断开&#…

js清空文本框的值_一个Vue.js实例控制字变大变小,含样式操作,flex布局。「603」...

这是一个用vue.js对css操作完成的实例。当然用了flex简单布局。一、先创建一个html文件,记得添加vue库文件。二、创建一盒容器vmdiv,用vue绑定它,测试vue绑定后的插入值text1效果。三、加入文本框和两个按钮。四、通过flex排序,让…

mysql mybatis 工具类_我肝了一个星期,为你们整理出了mybatis程序配置教程

1、搭建实验数据库我们创建一个mybatis实验数据库,并创建一个user表为后续实验准备2、IDEA新建项目,连接数据库新建一个普通的maven项目删除src目录,作为父工程pom.xml中导入相关的maven依赖1、 MySQL驱动2、 MyBatis驱动3、 junit驱动连接我…

mysql gt resource_实用干货,MYSQL这么用就对啦

本文主要梳理了 SQL 的基础用法,会涉及到以下方面内容:SQL大小写的规范数据库的类型以及适用场景SELECT 的执行过程WHERE 使用规范MySQL 中常见函数子查询分类如何选择合适的 EXISTS 和 IN子查询了解 SQLSQL 是我们用来和数据打交道的方式之一&#xff0…

python 查看当前目录_Python学习第156课--ls的运用、环境变量以及PATH

【每天几分钟,从零入门python编程的世界!】之前简单的介绍了Linux中几个简单的命令。这节再深入一点介绍下 ls 的运用。lsls相当于是list的简写,它的作用是把我们当前目录中的文件列举出来。ls -l把当前目录下的文件以及它的具体信息列举出来…

python对数组的操作_Python对数组的基本操作

# codingutf-8Created on 2014-3-29author: Administrator创建并打印数组arr ["aex", "bfe", "mpilgrim", "zddd", "example"];print(arr);#[aex, bfe, mpilgrim, zddd, example]print(arr[2]);#mpilgrim数组的负索引li[-n…

莫烦python博客_《莫烦Python》笔记 -- numpy部分

个人感觉,在numpy里,从说法上,数组与矩阵可以互换1.1 numpy & pandas有什么用?1.2 numpy & pandas的安装安装Anaconda2.1 numpy属性import numpy as np# 将一个列表转化为矩阵array np.array([[1,2,3],[2,3,4]])# 查看矩…

java 内存情况_java查看jvm内存使用情况

java查看jvm内存使用情况(2012-03-22 15:50:54)标签:jvm内存虚拟机分配itjava.lang.Runtime类提供了查看当前JVM内存的使用情况。每个java实例(即虚拟机实例)只有一个Runtime的实例,通过Runtime.getRuntime()可以得到当前虚拟机中的Runtime实例对象。Run…