十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成为现实。Go 团队实施了一个看起来比较稳定的设计草案,并且正以源到源翻译器原型的形式获得关注。本文讲述的是泛型的最新设计,以及如何自己尝试泛型。
成都创新互联公司主营永仁网站建设的网络公司,主营网站建设方案,手机APP定制开发,永仁h5重庆小程序开发搭建,永仁网站营销推广欢迎永仁等地区企业咨询
例子
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 {
X
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趋势报告显示,全球范围内有 110 万专业开发者选择Go作为其主要开发语言。如果把以其他编程语言作为主要开发语言,同时也在使用Go的开发者计算在内,这一数字将高达270万,中国的Go语言开发者排名第一,全球占比超过16%。
Go 语言能够支持并构建与微服务结合的内部工具、架构和后端服务而深受IT企业欢迎,许多IT架构工具由Go构建而成,例如大型的Kubernetes、Docker和Vault等。数据显示,有63%的具有统治力的云原生项目都是用Go构建。
因此,博睿数据在国内首发支持Go语言智能探针,对于提升业务性能,助力企业数字化转型有着非常重要的意义。
SmartAgent探针技术集结主流编程语言
SmartAgent是博睿数据自研的自动化部署的一体化探针,在已支持JAVA,PHP,.net,Nodejs,.NET Core,Python的基础上,新增了对Go语言的支持。
相较而言,传统探针技术需要客户配合修改应用程序代码,风险不可控,需要客户重新编译程序集成探针,耦合度高。
不同于行业内传统探针技术,博睿数据GoAgent探针直接后台安装即可,主动注入和嵌码,降低与客户程序耦合、无需二次修改代码、提高 GoAgent 技术易用性。无论是动态编译还是静态编译的代码,博睿数据Samrt Agent技术都可以在不进行任何修改的情况下进行服务级别和代码级别的分布式链路跟踪,实现业务的可观测性。
GoAgent探针支持六大功能,实现全链路追踪
1、较流行的主要编程语言——Java
Java语言在设计时引入了虚拟机(JVM),它架构在操作系统之上,屏蔽了底层实现的差异,所以,对于java代码,不管你在linux上还是windows上,只要安装了相应平台的java虚拟机,就可以跑起来。
2、较常用的整体编程语言——JavaScript
近些年来,JavaScript 的使用范围,慢慢超越了浏览器,正在向通用的系统语言发展。虽说JavaScript 的发明目的,就是作为浏览器的内置脚本语言,为你提供操控浏览器的能力。
如果你想提供漂亮的网页、令用户满意的上网体验、各种基于浏览器的便捷功能、前后端之间紧密的联系,JavaScript 是你必不可少的工具。
3、较有前途的编程语言——Go
Go 语言被称为“较有前途的编程语言”。因为 Go 在 2017 年的份额只有 百分之8,现在已达到 百分之18。此外,在调查报告中,多达 (百分之13) 的开发人员愿意采用或迁移到 Go 语言。Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。
4、世界上较好的编程语言——PHP
PHP 的语言之争一直都是程序员社区中的话题王。
PHP是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。但是就算做移动端,我们也离不开PHP。比如很多游戏的服务端,以及很多APP像是天猫的服务器端,都离不开PHP的身影;百分之60-70的APP应用服务器端,都对接PHP。
5、学习较多的编程语言——Python
Python,这门经常在各大编程语言排行榜前列露脸的语言,它是学习较多的编程语言。百分之27 的受访对象在过去 12 个月里开始或仍在持续学习 Python。Python语言在学术上非常受欢迎,哪怕不是学习计算机的人,很多都在学习Python。
总的来说,学习哪种编程语言更有前途,还是要找适合自己的,并且有兴趣、愿意在这个方面学习、钻研的,并且能不断为之努力的。