成都创新互联网站制作重庆分公司

go语言博客来源 go博客开源系统

如何看待go语言泛型的最新设计?

Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成为现实。Go 团队实施了一个看起来比较稳定的设计草案,并且正以源到源翻译器原型的形式获得关注。本文讲述的是泛型的最新设计,以及如何自己尝试泛型。

我们提供的服务有:成都网站设计、成都做网站、微信公众号开发、网站优化、网站认证、安达ssl等。为上1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的安达网站制作公司

例子

FIFO Stack

假设你要创建一个先进先出堆栈。没有泛型,你可能会这样实现:

type Stack []interface{}func (s Stack) Peek() interface{} {

return s[len(s)-1]

}

func (s *Stack) Pop() {

*s = (*s)[:

len(*s)-1]

}

func (s *Stack) Push(value interface{}) {

*s = 

append(*s, value)

}

但是,这里存在一个问题:每当你 Peek 项时,都必须使用类型断言将其从 interface{} 转换为你需要的类型。如果你的堆栈是 *MyObject 的堆栈,则意味着很多 s.Peek().(*MyObject)这样的代码。这不仅让人眼花缭乱,而且还可能引发错误。比如忘记 * 怎么办?或者如果您输入错误的类型怎么办?s.Push(MyObject{})` 可以顺利编译,而且你可能不会发现到自己的错误,直到它影响到你的整个服务为止。

通常,使用 interface{} 是相对危险的。使用更多受限制的类型总是更安全,因为可以在编译时而不是运行时发现问题。

泛型通过允许类型具有类型参数来解决此问题:

type Stack(type T) []Tfunc (s Stack(T)) Peek() T {

return s[len(s)-1]

}

func (s *Stack(T)) Pop() {

*s = (*s)[:

len(*s)-1]

}

func (s *Stack(T)) Push(value T) {

*s = 

append(*s, value)

}

这会向 Stack 添加一个类型参数,从而完全不需要 interface{}。现在,当你使用 Peek() 时,返回的值已经是原始类型,并且没有机会返回错误的值类型。这种方式更安全,更容易使用。(译注:就是看起来更丑陋,^-^)

此外,泛型代码通常更易于编译器优化,从而获得更好的性能(以二进制大小为代价)。如果我们对上面的非泛型代码和泛型代码进行基准测试,我们可以看到区别:

type MyObject struct {

int

}

var sink MyObjectfunc BenchmarkGo1(b *testing.B) {

for i := 0; i  b.N; i++ {

var s Stack

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink = s.Peek().(MyObject)

}

}

func BenchmarkGo2(b *testing.B) {

for i := 0; i  b.N; i++ {

var s Stack(MyObject)

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink = s.Peek()

}

}

结果:

BenchmarkGo1BenchmarkGo1-16     12837528         87.0 ns/op       48 B/op        2 allocs/opBenchmarkGo2BenchmarkGo2-16     28406479         41.9 ns/op       24 B/op        2 allocs/op

在这种情况下,我们分配更少的内存,同时泛型的速度是非泛型的两倍。

合约(Contracts)

上面的堆栈示例适用于任何类型。但是,在许多情况下,你需要编写仅适用于具有某些特征的类型的代码。例如,你可能希望堆栈要求类型实现 String() 函数

Go语言能在中国这么火是因为什么?

go语言之所以能成为我国最火的语言,是因为编写服务端高并发程序的优势。我大中华区但凡pv,日活高点的网站,应用,谁没点这个需求。这个领域中最优的几个:golang,erlang,rust。日常生活中人类社交是当今社会上的必然性,人们也伴随着科技时代的发展,智能电子产品的使用中也必然少不了语言输入,文字的编辑,语言转换的便利都均可来源于go语音输入法。

国内大学本科教育,哪个学校不以c/c++为入门教学语言。都十几年了,谭浩强还在大卖。语法相近的语言总是学习和使用成本最低的。这一点非常重要。coursera上有一门程序设计语言理论课上,开篇就阐述了这一点的重要性。假设go的入门成本是一个月,erlang的入门成本是2个月,那么整个程序员群体在学习后者的付出成本就很可观了。

google由于众所周知的原因,在国内程序员中不一般的地位。golang有个好背景。

go语言之前一直都没有接受待见,如今广大的群众开始接待,因为腾讯服务器段代码编译是支持go语言的

go语言会成为主流也是一个问题,

多虑了,没有竞争来关系。

虽然go成为源了世界上最并发的语言,这并不妨碍php成为世界上最好的语言,

也不妨碍java成为世界上最有模式的语言,

更不会妨碍c++成为21天就能学会了的语言。为什么Go语言如此不受待见

其实并没有不受待见,用的人还是很多的,解决一些特定领域的问题也很方便。

每种语言的流行程度主要取决于这个语言最著名的killerapp的流行程度,C有Linux,Go有Docker。

《Go语言实战》epub下载在线阅读,求百度网盘云资源

《Go语言实战》(威廉·肯尼迪 (William Kennedy))电子书网盘下载免费在线阅读

链接:

提取码:1234

书名:Go语言实战

作者:威廉·肯尼迪 (William Kennedy)

译者:李兆海

豆瓣评分:7.7

出版社:人民邮电出版社

出版年份:2017-3-1

页数:224

内容简介:

Go语言结合了底层系统语言的能力以及现代语言的高级特性,旨在降低构建简单、可靠、高效软件的门槛。本书向读者提供一个专注、全面且符合语言习惯的视角。Go语言实战同时关注语言的规范和实现,涉及的内容包括语法、类型系统、并发、管道、测试,以及其他一些主题。

作者简介:

William Kennedy,是一位熟练的软件开发者,也是博客GoingGo.Net的作者。

Brian Ketelsen和Erik St. Martin是全球Go语言大会GopherCon的组织者,也是Go语言框架Skynet的联合作者。

李兆海,多年专注于后端分布式网络服务开发,曾使用过多个流行后端技术和相关架构实践,是Go语言和Docker的早期使用者和推广者,《第1本Docker书》的译者。作为项目技术负责人,成功开发了百万用户级直播系统。

利用GitHub-Actions将Hugo博客自动发布到GitHub和Gitee Pages

现在个人博客通常有比较多的选择,如果不想要自己购买服务器实现静态博客的发布,可以在、CSDN等平台建立自己的账号并发布,但是原始数据无法在本地管理;如果想要数据完全自己管理,可以使用GitHub或者Gitee Pages功能发布自己的博客,利用Hugo或Hexo等成熟的静态博客将md文件转换成静态网站文件进行快速发布。本文就用来记录如何快速将博客发布到、GitHub以及Gitee Pages三个平台。

我希望的流程当然是主要精力用在写文章,发布的流程最好完全不需要手动处理,但实际情况下手动发布博客的流程大体是:

之前有使用过Travis CI+GitHub+Hexo自动发布到GitHub Pages,但是GitHub的访问经常不那么靠谱,因此想着也能同步到Gitee,并且自动构建Hexo的速度受Nodejs环境部署影响,速度很慢,因此本次计划采用Hugo来构建网站文件,整体流程设计如下:

为了满足博客自动发布流程,首先需要在本地准备好生产环境,以满足快速发布,以此的复杂是为了长期的简单,因此在环境准备阶段我会把所有涉及的工具都记录下来,以方便大家使用以及后边自己回顾,环境准备包含:

Obsidian完成知识积累后,按照ZK-Project-Archive-Blog的流程发布Blog,但是Obsidian的文件相互关联,且附件如何快速复用,需要对Typora和Obsidian都进行简单的配置,确保后续Blog能够快速完成并发布,并且文件仍在Obsidian工程中正常显示;

Typora非常的简洁,而且可以实时预览,在写博客的时候经常会插入一些图片,截图后可以直接粘贴进去,图片也会自动保存在本地,这里需要注意图片的保存路径,在偏好设置里,设置插入图片时复制到指定路径(./resource/),这样复制的图片就会自动保存在当前文件夹下的resource文件夹里,方便后续管理与转移。

在.ssh文件生成id_rsa和id_rsa.pub两个文件;

Hugo 是一个基于Go语言开发的静态博客框架,号称世界上最快的构建网站工具;

命令为: hugo new site myblog

myblog为博客的目录名,可以修改为你自己想取的名字,生成的目录如下:

由于默认主题生成的文章页面有些功能是不需要的,因此需要对themes下文件进行修改:

将config、content和themes三个目录拷贝到新创建的站点目录,将content下替换为文章文件即可。

utterances 是一款基于Github Issue的Github工具,优点主要是无广告、加载快、配置简单,轻量开源。

由于 utterances 是一款Github App,因此 安装utterances 非常简单,只需要授权特定repo权限给 utterances 就可以了,注意一个点:授权的这个repo必须是public的,可以选择多个repo,但是建议选择一个就可以了,也比较安全。

这是当前最简单的配置方法, 也可以在 utterances官方 查看其他配置方法,以及详细的配置参数说明。

Obsidian的安装和使用可参考我的另一篇文章: Obsidian作为第二大脑工具的基本使用和配置

所有环境准备好后,终于要开始启动我们的自动化流程的实现了;

同之前步骤相同,将Gitee密码配置到GitHub Secrets,命名为:GITEE_PASSWORD,所有配置结果如下:

synctogitee.yml

需要绑定Gitee账号到微信公众号,否则最后一步reload pages自动部署Gitee Pages会登录失败,原因是需要短信验证;绑定公众号后则不需要短信验证;其他问题解决可以参考 gitee-pages-action

在Typora完成文章编写后,一键上传所有图片到Gitee图床,拷贝发布到,然后提交到GitHub repo master分支,即可自动部署到GitHub和Gitee Pages;

以上就是我利用GitHub-Actions将Hugo博客自动发布到GitHub和Gitee Pages,希望可以帮助大家快速构建自己的个人网站;后边我会继续完善我的第二大脑系统的构建思路和方法。


网页名称:go语言博客来源 go博客开源系统
URL分享:http://cxhlcq.com/article/dophcci.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部