Go 语言不是面向对象语言。

Go 语言的三位创始人:

在这里插入图片描述

(从左到右分别是 Robert Griesemer、Rob Pike 和 Ken Thompson)

Go 语言历史年表

时间 事件
2007年9月 三位创始人进行了一次讨论会
2008年 肯·汤普森实现了第一版 Go 编译器
2009年11月10日 谷歌宣布开源 Go 语言,这一天为 Go 诞生日
2012年3月 Go 1.0 发布,并宣布 Go 编译器永远兼容旧代码
2014年 Go 1.4 发布,最后一个编译器和运行时由 C 语言实现的版本
2015年 Go 1.5 发布,实现自举,大幅降低 GC 延迟
2018年 Go 1.11 发布,引入新的包管理机制:go module
2021年 Go 1.16 发布,go module 称为默认包管理机制
2022年3月 Go 1.18 发布,支持泛型

如今,Go 语言基本每年发布两个版本,一般在 2 月和 8 月。

1,Go 下载

下载页面下载:

在这里插入图片描述

解压后得到名为 go 的目录:

  • Linux:放在 /usr/local/ 目录下
    • $HOME/.profile 文件末尾添加 export PATH=$PATH:/usr/local/go/bin
    • 然后执行 source ~/.profile
    • 最后执行 go version 查看是否安装成功
  • Window:可放在 C:\

对于 Ubuntu 中卸载自带(apt-get install) Go 的方式:

sudo apt-get remove golang-go
sudo apt-get remove --auto-remove golang-go

Vim Go 插件

2,Go 代码的执行顺序

Go 程序的入口函数是 main.main,即 main 包中的 main 函数。

package main

func init() {

}

func main() {
    // 用户层执行逻辑
    ... ...
}
  • main 函数是 Go 程序的入口函数
  • init 函数与 main 函数都是无参数无返回值的函数
  • init 函数比 main 函数先执行,一般用于包的初始化
  • init 函数不能被开发者手工调用,只能被 Go 程序默认调用
  • 一个包中可以有多个同名的 init 函数,它们的执行顺序是根据其声明次序依次调用

Go 包的初始化次序如下:

在这里插入图片描述

  • Go 会根据包的导入顺序依次的初始化每个包
  • 包的初始化过程中,采用深度优先原则
  • 每个包中,除了 import 之外,会按照“常量->变量->init函数”的顺序进行初始化
  • 如果某个包被多个包 import,那么该包只会被初始化一次

3,Go 常量与变量

在 Go 语言中,常量和变量在使用之前,必须要先进行声明。

Go 语言的变量可以分为两类:

  • 包级变量,是在包级别可见的变量。如果是导出变量(大写字母开头),那么这个包级变量也可以被视为全局变量
  • 局部变量,是 Go 函数或方法体内声明的变量,仅在函数或方法体内可见

常量的声明方式

const a = 1

const Pi float64 = 3.14159265358979323846 // 单行常量声明

// 以const代码块形式声明常量
const (
    size int64 = 4096
    i, j, s = 13, 14, "bar" // 单行声明多个常量
)

iota // go 中的特殊常量,常用于枚举

变量的声明方式

var a int	// 显示指定类型,不进行初始化,值为类型的默认值

var a int = 3	// 显示指定类型,并进行初始化

var a = 3	// 不显示指定类型,具体类型由 GO 自行推断
                // 整型值的默认类型 int
                // 浮点值的默认类型为 float64
                // 复数值的默认类型为 complex128
                // 布尔值的默认类型是 bool
                // 字符值默认类型是 rune
                // 字符串值的默认类型是 string 
                
a := 3          // 短变量声明,只允许出现在函数内部

// 变量声明块
var (
    a int = 128
    b int8 = 6
    s string = "hello"
    c rune = 'A'
    t bool = true
)

// 一行中声明多个变量
var a, b, c int = 5, 6, 7

var (
    a, b, c int = 5, 6, 7
    c, d, e rune = 'C', 'D', 'E'
) 

// 声明多个不同类型的变量
var a, b, c = 12, 'A', "hello"
a, b, c := 12, 'A', "hello"		// 短变量声明方式

(完。)