# Go语言简介

参考

[1] Go 和 Golang 有什么关系? https://blog.csdn.net/EDDYCJY/article/details/120837946

# 官网

https://golang.google.cn

开发文档:

https://pkg.go.dev/std

https://studygolang.com/pkgdoc

# Go or Golang ?

go1.png 这一门语言称为 “Go”,不叫 “Golang”,也不叫 “GO”。“golang” 只是网站的地址,而不是语言的名称。

但可能又有小伙伴疑惑了,那为什么 “Golang” 这个别名,如此之火。到底是为什么?

这里一共有三点原因,分别是:站点地址(Go FAQ 提到)、搜索引擎、社区和论坛等。

# Go 站点地址

Go 团队所期望的 https://go.org 早就被注册,从网站的底部标识来看,2008 年起建站:

所以 Go 语言只能使用 https://golang.org,你也会 https://pkg.go.dev 和 https://golang.org、https://godoc.org,存在多个域名,并不统一。

因此作为 Go 开发者所常用官方站点,自然而然 golang 这一个语言标识就深深地被记住了,一直沿用至今。

同时域名为 “golang” 关键字,自然会大幅度的影响到 Go 资料搜索引擎的收录,是一个非常重要的因素。

# 搜索引擎

在早年 Go 语言还不知名时,用 go 关键字去搜索资料会非常的困难。这是各大搜索引擎早年的一个槽点(reddit 很多吐槽)。

因为单一的 go 关键字过于广泛了,很多人会直接用 golang 关键字来搜资料,反而会更能看到一些与 Go 真正相关的。

# 社区和论坛

在社区、论坛等,也有类似的问题。因为占位、重名、认知等原因。像是 segmentfault、twitter 叫 golang。掘金叫 Go,各有不同。

这点难以改善,毕竟各家都是不同企业的。所以难受的点是用户,搜了 Go,可能搜不到,又跑去搜 Golang 才可以。

再看看国外的论坛,在 Google 群组 golang-nuts 和 golang-dev 也有类似偏差。

基本可以明确 “Golang” 更多会被用在搜索和标签上,能够保证搜索和标签查询的结果。[1]

# Google为什么要创建Go

  • 计算机硬件技术更新频繁,性能提高很快。目前主流的编程语言发展明显落后于硬件,不能合理利用多核多CPU的优势提升软件系统性能。
  • 软件系统复杂度越来越高,维护成本越来越高,目前缺乏一个足够简洁高效的编程语言。
    • 现有编程语言存在:风格不统一、计算能力不够、处理大并发不够好
  • 企业运行维护很多c/c++的项目,c/c++程序运行速度虽然很快,但是编译速度确很慢,同时还存在内存泄漏的一系列的困扰需要解决。

# Go语言发展历史

  • 2007年,谷歌工程师Rob Pike,Ken Thompson和Robert Griesemer开始设计一门全新的语言,这是Go语言的最初原型。
  • 2009年11月10日,Google将Go语言以开放源代码的方式向全球发布。
  • 2015年8月19日,Go1.5版发布,本次更新中移除了”最后残余的c代码”
  • 2017年2月17日,Go语言Go1.8版发布。
  • 2017年8月24日,Go语言Go1.9版发布。
  • 2018年2月16日,Go语言Go1.10版发布。

# Go语言的特点

Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,使用一个表达式来形容Go语言:Go=C+Python,说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。

  • 从c语言中继承了很多理念,包括表达式语法,控制结构,基础数据类型,调用参数传值,指针等等,也保留了和C语言一样的编译执行方式及弱化的指针。
// go语言的指针使用特点
func testPtr(num *int)  {
	*num = 20
}
  • 引入包的概念,用于组织程序结构,Go语言的一个文件都要归属于一个包,而不能单独存在。
  • 垃圾回收机制,内存自动回收,不需开发人员管理 【稍微不注意就会出现内存泄漏】
  • 天然并发【重要特点】
    • 从语言层面支持并发,实现简单
    • goroutine,轻量级线程,可实现大并发处理,高效利用多核。
    • 基于CPS并发模型(Communicating Sequential Processes)实现
  • 吸收了管道通信机制,形成go语言特有的管道channel,通过管道channel,可以实现不同的goroute之间的相互通信
  • 函数返回多个值(实例代码)
  • 新的创新:比如切片slice,延时执行defer等

# Hello Go

我们写一个最简单的入门代码,在控制台输出hello go!

package main
// fmt包中提供格式化,输入和输出的函数
import "fmt"
func main() {
	fmt.Println("hello go!")
}

# Golang执行流程

我们可以通过以下命令来进行操作

  • go build hello.go -> hello.exe
  • go run hello.go

go2.png

# 两种执行流程

  • 如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有go开发环境的机器上,然可以运行
  • 如果我们是直接go run go源代码,那么如果要在另外一个机器上运行,也需要go开发环境,否则无法执行。
  • 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变大了很多。

# 什么是编译

  • 有了go源文件,通过编译器将其编译成机器可以识别的二进制码文件。
  • 在该源文件目录下,通过go build 对hello.go文件进行编译。可以指定生成的可执行文件名,在windows下必须是.exe后缀。
  • 如果程序没有错误,没有任何提示,会在当前目录下会出现一个可执行文件(windows下是.exe Linux下是一个可执行文件),该文件是二进制码文件,也是可以执行的程序。
  • 如果程序有错误,编译时,会在错误的那行报错。

# Go语言开发注意事项

  • Go源文件以“go”为扩展名
  • Go应用程序的执行入口是main()方法
  • Go语言严格区分大小写。
  • Go方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性。
  • Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
  • Go语言定义的变量或者import的包如果没有使用到,代码不能编译通过
  • 大括号都是成对出现的,缺一不可。