Go语言入门
学习内容视频来源慕课网GO语言语法入门篇,这是入门篇,下次总结学习进阶篇。这里面并没有代码说明,只是理论上的只是
Go语言特点
- 静态类型的、编译型的开源语言
- 脚本化的语法,支持多种编程范式->函数式编程&面向对象编程
- 原生、给力的并发编程支持
Go语言优势
- 脚本化的语法。非常容易的编程Go语言程序
- 静态类型+编译型,程序运行速度有保障
- 原生的支持并发编程。降低开发法、维护成本;程序可以更好的执行
Go语言劣势
- 语法糖没有Python和Ruby多
- 目前程序的运行速度还不及C
- 第三方函数库暂时没有绝对主流的编程语言多
Go基本规则
工作区&GOPATH
工作区是存放Go源码文件的目录,命令源码不一定放到工作区中
- src目录:存放源码文件以代码包为组织形式
- pkg目录:存放归档文件(以.a为后缀的文件)
- 平台相关目录:两个隐含的Go语言环境变量:GOOS和GOARCH
- bin目录:存放当前工作区中的Go程序的可执行文件
源码文件的分类和含义
Go源码文件
- 以.go为后缀的,内容以Go语言代码组织的文件,多个Go源码文件是以代码包组织起来
- 分三类
- 命令源码文件:声明自己属于main代码包、包含无参数声明和结果声明的main函数 Go语言程序的入口
- 库源码文件:一般源码文件
- 测试源码文件 辅助源码文件:名称以Test或Benchmark为前缀
代码包
作用:编译和归档Go程序的最基本单位;代码划分、集结和依赖的有效组织形式,也是权限控制的辅助手段
规则:一个代码包实际上是一个由导入路径代码的目录
声明:每个源码文件必须声明其所属的代码包
初始化:无参数声明和结果声明的init函数
Go命令行工具介绍
go build:用于编译源码文件、代码包、依赖包;
go run:可以编译并运行Go源码文件
go get:动态获取远程代码包
Go语言基础语法
关键字
break | default | func | interface | select |
---|---|---|---|---|
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
contine | for | import | return | var |
标识符
append | bool | byte | cap | close | complex |
---|---|---|---|---|---|
complex64 | complex128 | uint16 | copy | false | float32 |
float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new |
nil | panic | uint64 | println | real | |
recover | string | TRUE | uint | uint8 | uintprt |
注释
- 注释形式
- 单行注释
//当行注释
- 多行注释
/* */
- 单行注释
- 基础结构
- 程序package,导包、常亮定义、一般类型、结构类型、接口声明、函数定义
package
- package是最基本的分发单位和工程管理中的依赖关系的体现
- 每个Go语言源代码文件开头都拥有一个package声明,表示源码文件所属的代码包
- 要生成Go语言可执行程序,必须要有main的package包,且必须在该包下由main()函数
- 同一个路径下只能存在一个package,一个package可以拆分多个源文件组成
import
- import语句可以导入源码文件所依赖的package包
- 不得导入源码文件中没有用到的package包,否则Go语言编译器会报编译错误
imprt原理
- 如果一个main包导入其他包,包将被顺序导入;
- 如果导入的包中依赖其他包,会首先导入其他包,然后初始化其他包中的常量和变量,最后如果其他包中有init(),会自动执行init()
- 所有包导入完成后才会对main函数中的常量和变量进行初始化,然后执行main中的init函数(如果存在),最后执行main函数
- 如果一个包被导入多次则该包只会被导入一次
数值类型,字符类型和布尔型
整型、浮点型、复数、字符串和布尔型:布尔型的值只可以是true或者false。字符串类型string,编码为统一的utf-8
序号 | 类型和描述 |
---|---|
1 | uint8(无符号8位整型0-255) |
2 | uint16(无符号16位整型0-65535) |
3 | uint32(无符号32位整型) |
4 | uint64(无符号64位) |
5 | int8(有符号8位-128到127) |
6 | int16 |
7 | int32 |
8 | int64 |
序号 | 类型和描述 |
---|---|
1 | float32 |
2 | float64 |
3 | complex64 |
4 | complex128 |
序号 | 类型和描述 |
---|---|
1 | byte |
2 | rune |
3 | uint |
4 | int |
5 | uintptr(用于存放指针) |
派生类型
- 指针类型(Pointer)
- 数组类型
- 结构化类型(struct)
- Channel类型(chan)
- 函数类型(func)
- 切片类型(slice)
- 接口类型(interface)
- Map类型(map)
类型零值和类型别名
- 类型零值不是空值,而是某个变量被声明后的默认值,一般情况下,值类型的默认值为0,布尔类型默认值为false,string默认值为空字符串
- 可以对类型设置别名
类型存储大小
Go语言数据类型
变量声明、初始化和赋值
-
单个变量声明和赋值
-
变量声明格式:var <变量名称> [变量类型]
-
变量赋值格式:<变量名称> = <值、表达式、函数等>
-
声明和赋值同时进行:var <变量名称> [变量类型] = <值、表达式、函数等>
-
分组声明格式:
var ( i int j float32 name string )
-
-
同一行声明多个变量和赋值: var a, b, c int = 1, 2, 3 或者a, b := 1, 2
-
全局变量的声明必须使用var关键词,局部变量可以省略
-
特殊变量下划线“_”:
-
Go中不存在隐式转换,类型转换必须是显示的
-
类型转换只能发生在两种兼容类型之间
-
类型转换格式: <变量名称> [:] = <目标类型> (<需要转换的变量>)
变量可见性规则
- 大写字母开头的变量是可导出的,也就是其他包可以读取的,是公用变量
- 小写字母开头的变量是不可导出的,是私有变量
常量,常量声明和iota的使用
常量定义形式和常量类型范围
- 常量定义从形式上可分为显式和隐式
- 显式:const identifier [type] = value
- 隐式:const identifier = value (通常叫做无类型常量)
- 常量可以使用内置表达式定义:len(), unsafe.Sizeof()
- 常量范围目前只支持布尔型男、数字型和字符型
特殊变量iota的使用
- ioat在关键字const关键字出现时将被重置为0
- 在const中每新增一行常量声明将被使iota计数一次
- iota常见使用法:
- 跳值使用法
- 插队使用法
- 表达式隐式使用法
- 单行使用法
Go语言运算符
算术运算符
Go语言不能使用--a和++a这种方式
-
-
- *
- /
- %
关系运算符
- == 检查两个操作数的值是否相等,如果相等,则条件为真,否则为假
- != 检查两个操作数的值是否相等,如果值不相等,则条件为真,否则为假
- > 检查左操作数的值是否大于右操作数的值,如果是,则条件为真,否则为假
- < 检查左操作数的值是否小于右操作数的值,如果是,则条件为真,否则为假
- >= 检查左操作数的值是否大于或者等于右操作数的值,如果是,则条件为真,否则为假
- <= 检查左操作数的值是否小于或者等于右操作数的值,如果是,则条件为真,否则为假
逻辑运算符
- && 逻辑与运算符。如果两个操作数都不为零,则条件为真,否则为假
- || 逻辑或运算符。如果两个操作数中的任何一个非零,则条件为真,否则为假
- ! 逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑非运算符将为假
按位运算符
- & 按位与:都为1则结果为1
- | 按位或:有一个为1结果为1
- ^ 按位异或:对应位不同的数值时结果为1
- << 左移:把数整体向左移动
- >> 右移:把数整体向右移动
赋值运算符
- = 表达式的值赋值给一个左值
- += 相加后再赋值
- -= 相减后再赋值
- *= 相乘后再赋值
- /= 相除后再赋值
- %= 求余后再赋值
- <<= 左移后再赋值
- >>= 右移后再赋值
- &= 按位与后赋值
- ^= 按异或后再赋值
- |= 按位或后赋值
Go语言控制语句
这部分如平常的控制语句一样