Go是一门什么样的语言?

简介: Go是一门什么样的语言?

Go语言基本介绍

  首先Go语言诞生于2007年由谷歌公司研发,2009年开源,2012年推出1.0版本,Go是一种语言层面支持并发(Go最大的特色、天生支持并发)、内置runtime,支持垃圾回收(GC)、静态强类型,快速编译的语言(编译型语言)。

知识拓展:

静态强类型语言是什么?

静态强类型语言=静态类型语言+强类型语言

动态类型语言和静态类型语言

动态类型语言

动态类型语言和动态语言是完全不同的两个概念。
动态类型语言:是指在运行期间才去做数据类型检查的语言,说的是数据类型,
动态语言:说的是运行是改变结构,说的是代码结构。
动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段。
主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

静态类型语言

静态语言的数据类型是在编译期间(或运行之前)确定的,编写代码的时候要明确确定变量的数据类型。
主要语言:C、C++、C#、Java、Object-C。

Go 语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么。

提前知道值的类型的好处有很多,比如编译器可以合理的使用这些值,可以进一步优化代码,提高执行的效率,减少 bug 等等。

类型检查

所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行时期(动态检查)

强类型与弱类型语言

强类型:

强类型语言是一种强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。

弱类型:

弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换。

编译型语言和解释型语言区别

类型

原理

优点

缺点

编译型语言

通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux 等)执行的机器码(以可执行文件的形式存在)。

编译一次后,脱离了编译器也可以运行,并且运行效率高。

可移植性差,不够灵活。

代表语言:C、C++、Pascal、Object-C、swift

解释型语言

由专门的解释器,根据需要将部分源代码临时转换成特定平台的机器码。

跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。

一边执行一边转换,效率很低。

代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

混合型语言(特殊)

既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类CLR(CLR公共语言运行是让 .NET 程序执行所需的外部服务的集合,.NET 平台的核心和最重要的组件,类似于 Java 的 JVM)。.NET在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行。我个人认为抛开一切的偏见C#是这个星球上最好的编程语言。可惜微软的政策限制了C#的推广。

Java是一种特殊的高级性语言,它既有解释性语言的特征,也有编译性语言的特征,因为它是经过先编译,后解释的过程。
简单说:HelloWorld.java————>HelloWolrd.class————>特定平台的机器代码
①编译 ②解释

Go语言的特点有哪些?

  • 语法简洁。

简单好记的关键词和语法。golang语法简单,这个是真的简单,即使从来没接触过过编程的用户,都可以轻松上手,比c++、java、.net更简单易学,甚至比php学起来都轻松。与同为强类型语言的比c++比,更是简单得多。虽然简单,但是实现起功能来,一点也不含糊。

  • 开发效率高。

GO语言使用起来简单、代码描述效率高、编码规范统一、上手快。 通过少量的代码,即可实现框架的标准化,能快速的构建各种通用组件和公共类库,进一步提升开发效率,实现特定场景下的功能量产。

  • 良好的语言设计。

从学术的角度讲Go语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是Go自带完善的工具链,大大提高了团队协作的一致性。比如gofmt自动排版Go代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码。此外还有gofix, govet等非常有用的工具。

  • 部署简单。

Go编译生成的是一个静态可执行的文件,除了glibc外没有其他外部依赖。这让部署变得非常的方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需要的各种包、库的依赖关系,大大减少了维护的负担。

  • 并发性好。

Goroutine(Go轻量级线程)和channel使得编写高并发的服务端软件变得相当的容易,很多情况下完全可以不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个CPU核并行执行的性能好。

  • 执行性能强。

毕竟是类C的执行速度,对于一些服务来说,性能是极其重要的一环,事关系统的吞吐、访问的延迟,进而会影响用户的体验,Go语言通过协程可以方便的实现并行处理,达到处理效率的最大化 ,提升系统的吞吐能力。

  • 执行性能好。

虽然不如C和Java,但通常比原生Python应用还是高一个数量级的,适合编写—些瓶颈业务。内存占用也非常省。

相关文章
|
2天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
9 1
|
2天前
|
Go
|
3天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
131 1
|
3天前
|
算法 关系型数据库 MySQL
Go语言中的分布式ID生成器设计与实现
【5月更文挑战第6天】本文探讨了Go语言在分布式系统中生成全局唯一ID的策略,包括Twitter的Snowflake算法、UUID和MySQL自增ID。Snowflake算法通过时间戳、节点ID和序列号生成ID,Go实现中需处理时间回拨问题。UUID保证全局唯一,但长度较长。MySQL自增ID依赖数据库,可能造成性能瓶颈。选择策略时需考虑业务需求和并发、时间同步等挑战,以确保系统稳定可靠。
111 0
|
3天前
|
缓存 NoSQL Go
Go语言中的分布式锁实现与选型
【5月更文挑战第6天】本文探讨了Go语言中分布式锁的实现,包括Redis、ZooKeeper和Etcd三种方式,强调了选型时的性能、可靠性和复杂度考量。通过代码示例展示了Redis分布式锁的使用,并提出了避免死锁、公平性等问题的策略。结论指出,开发者应根据业务需求选择合适实现并理解底层原理,以确保系统稳定和高效。
127 0
|
3天前
|
NoSQL 算法 Go
Go语言中的分布式事务处理方案
【5月更文挑战第6天】本文探讨了Go语言在分布式事务处理中的应用,包括2PC、3PC和TCC协议。通过示例展示了如何使用Go的`goroutine`和`channel`实现2PC。同时,文章指出了网络延迟、单点故障、死锁和幂等性等常见问题,并提供了相应的解决策略。此外,还以Redis Redlock为例,展示了如何实现分布式锁。理解并实施这些方案对于构建高可用的分布式系统至关重要。
98 0
|
4天前
|
缓存 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
【5月更文挑战第5天】本文介绍了Go语言项目中的CI/CD实践,包括持续集成与持续部署的基础知识,常见问题及解决策略。测试覆盖不足、版本不一致和构建时间过长是主要问题,可通过全面测试、统一依赖管理和利用缓存优化。文中还提供了使用GitHub Actions进行自动化测试和部署的示例,强调了持续优化CI/CD流程以适应项目需求的重要性。
43 1
|
4天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
44 1
|
4天前
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
26 1
|
5天前
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
21 0