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,一经查实,立即删除!

相关文章

css div里引用em字体会变斜体_CSS文字加粗斜体[解决代码]

CSS如何给文字加粗,这是小白常见的问题,今天俺跟大家总结分享。标签解决办法一般老的浏览器可能会使用类似或来加粗文字用来设置斜体,例如以下代码:加粗字体加粗字体斜体但是此办法语义化不是很好,设置字体加粗推荐使用…

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

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

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

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

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

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

runtime无法执行grep_如何使管道使用Runtime.exec()?

慕运维8079593我在Linux中遇到了一个类似的问题,只不过是“ps-ef_grep找进程”。至少使用“ls”可以替换与语言无关(尽管速度较慢)的Java。例如:File f new File("C:\\");String[] files f.listFiles(new File("/home/tihamer"));…

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…

word2vec应用场景_介绍Word2Vec和Glove这两种最流行的词嵌入方法背后的直觉

NLP的首要问题就是寻求恰当的文本表示方法。因为,良好的文本表示形式,是后续进一步处理的基础。近年来,词嵌入方法越来越流行,在各种各样的NLP任务中得到了广泛的应用。简单而言,词嵌入是通过无监督方式学习单词的向量…

pythonflask框架_Flask框架

一、Web前端与后端(PythonWeb)1.Web前端:网页,包含HTML,CSS,JS。静态网页:不能与服务器交互的网页动态网页:能够与服务器交互的网页2.Web后端:、Flask,Django、Ajax技术二、服务器1.…

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

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

overleaf 插入图片_latex中插入图片

latex排版之插入图片:在排版图片之前,个人认为不管用不用到,引入下面两个包:\usepackage{graphicx}\usepackage{subfigure}(1)插入单个图片,图片格式为png\begin{figure}[h]\centering\includegraphics[width4cm,heigh…

debian命令乱码_Debian 9.5 解决中文显示乱码

一.首先检查LOCALE情况说明:DEBIAN因为基于GNU所以,对不同地域进行了不同的包支持,以LOCALE形式存在。1、启动终端#apt-get install locales2、重新配置LOCALE#dpkg-reconfigure locales在界面中我勾选的是“en_US.UTF-8”和“zh_CN.UTF-8”。…

ssh 连接mysql_mysql命令行客户端如何通过ssh服务器连接数据库啊?

ssh到跳板机然后用 mysql 连接利用ssh开启一个隧道我这里的MySQL服务器是192.168.41.83, 我要在192.168.41.72连接首先在192.168.41.72执行命令开启隧道[rootmysql-test-72 ~]# ssh -NPf -o StrictHostKeyCheckingno root192.168.41.83 -L 3305:127.0.0.1:3306root192.168.41.8…

mysql 创建 数据库失败_MySQL创建数据库失败

如果使用root账号登录到数据库create database时提错错误:MySQL: 1006 - Can‘t create database ‘***‘ (errno: 13)或MySQL: 1006 - Can‘t create database ‘***‘ (errno: 28),一般是mysql用户没有目录权限的问题。先用Linux指令 : ls -ld 查看d…

mysql 客户服务号_mysql客户端及服务端常用实用工具功能总结

一、MySQL服务器端实用工具程序:1、mysqld:SQL后台程序(即MySQL服务器进程),客户端通过该服务连接服务器来访问数据库。2、mysqld_safe:服务启动脚本。mysqld_safe增加了一些安全特性,如当出现错误时重启服务器并向错误…