Go——Go语言简介
Go语言的诞生背景
G0语言的诞生主要基于如下原因:
- 摩尔定律接近失效后多核服务器已经成为主流,当前的编程语言对并发的支持不是很好,不能很好地发挥多核CPU的威力。
- 程序规模越来越大,编译速度越来越慢,如何快速地编译程序是程序员的迫切需求。
- 现有的编程语言设计越来越复杂,由于历史的包袱,某些特性的实现不怎么优雅,程序员花费了更多的精力来应对编程语法细节而不是问题域。
G0语言就是为了解决当下编程语言对并发支持不友好、编译速度慢、编程复杂这三个问题而诞生的。
Go语言特性
特性集合 | 特性项 | Go | C | Java |
基础语法 | 关键字和保留字 | 25个 | ANSI32个 | 大于48个 |
控制结构 | 支持顺序、循环、分支 | 支持顺序、循环、分支 | 支持顺序、循环、分支 | |
类型系统 | 动、静特性 | 静态语言,支持运行时动态类型 | 静态语言 | 静态语言 |
强、弱特性 | 强类型 | 弱类型 | 强类型 | |
隐式类型推到 | 支持 | 否 | 否 | |
类型安全 | 类型安全 | 非类型安全 | 类型安全 | |
自定义数据类型 | 支持type自定义 | struct | 通过类/接口实现自定义类型和行为 | |
抽象 | 函数 | 支持 | 支持 | 支持 |
面向对象支持 | 类型组合支持面向对象 | struct内嵌函数指针支持 | 类/接口 | |
接口 | Duck模型 | void间接支持 | 显式声明 | |
多态 | 通过接口支持 | void间接支持 | 接口及继承关系支持 | |
元编程 | 泛型支持 | 无 | 无 | 有 |
反射支持 | 有 | 无 | 有 | |
平台和运行模式 | 编译模式 | 编译成可执行程序 | 编译成可执行程序 | 编译成字节码 |
运行模式 | 直接运行 | 直接运行 | 虚拟机加载执行 | |
内存管理 | 支持自动垃圾回收 | 手动管理 | 支持自动垃圾回收 | |
并发支持 | 协程(语言原生支持) | OS线程(库支持协程) | Java线程(JVM内部映射到OS线程) | |
交叉编译 | 支持 | 支持 | 中间代码无交叉编译必要 | |
夸平台 | 支持 | 支持 | 原生跨平台 | |
语言软实力 | 标准库和第三方 | 丰富,发展很快 | 很丰富 | 很丰富 |
框架 | 丰富,发展很快 | 很丰富 | 很丰富 | |
语法兼容性 | 向前兼容性好 | 向前兼容性好 | 向前兼容性好 | |
影响力 | 社区活跃,Google背书 | 40多年宝刀未老 | 社区活跃 | |
应用领域 | 云计算基础设施软件、中间件、区块链 | OS及系统软件 | 企业级应用/大数据/移动端 |
第一个Go程序
package main
import "fmt"
func main() {
fmt.Println("Hello world!\n")
}
程序功能解读:
- 第1行定义一个包,包名为main,main是可执行程序的包名,所有的Go源程序文件头部必须有一个包声明语句,Go通过包来管理命名空间。
- 第3行import引用一个外部包fmt,可以是标准库的包,也可以是第三方或自定义的包,fmt是标准输入/输出包。
- 第5行使用func关键字声明定义一个函数,函数名为main,main代表Go程序入口函数。
- 第6行调用fmt包里面的Printf函数,函数实参是一个字符串字面量,在标准输出里面打印一句话“Hello world!\n”,\n是一个转义符,表示换行。
Go源代码的特征解读:
- 源程序以.go为后缀。
- 源程序默认为UTF-8编码。
- 标识符区分大小写。
- 语句结尾的分号可以省略。
- 函数以func开头,函数体开头的“{”必须在函数头所在行尾部,不能单独起一行。
- 字符串字面量使用““””(双引号)括起来。
- 调用包里面的方法通过点“.”访问符,比如示例中的fmt.Printf。
- main函数所在的包名必须是main。
编译运行:
//编译
go build hello.go
//运行
./hello
Hello world!
还没有评论,来说两句吧...