go语言的基本结构和类型
文件名与关键字
- 有效的标识符必须以字符(可以使用任何 UTF-8 编码的字符或 _)开头,然后紧跟着 0 个或多个字符或 Unicode 数字
- _ 被称为空白标识符。他可以用于变量的声明和赋值(任何数据类型都可以赋值给他),但是赋值之后将会被丢掉,无法在后续代码中使用,而且也不可以使用这个标识符进行赋值和运算
- 程序的代码通过语句来实现结构化。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
包与导入
- package main 表示一个可以独立执行的程序,每个go程序都包含一个名为main的包
- 所有的报名都必须使用小写字母
- 属于同一个包的文件必须全部被一起编译
- 如果import 包名不是由.或者/开头的,则go会在全局文件中进行查找。./会在相对路径中查找,/会在绝对路径中查找
- 导入包相当于包含了这个包的所有的代码对象
import fm "fmt"
根据自己的喜好给包起别名- 如果你导入了一个包但是并没有使用,将会报错
导入的可见性规则
- 当标识符<常量,变量,函数名,结构字段等等>以一个大写字母开头,这个标识符的对象可以被外包使用
- 当标识符<常量,变量,函数名,结构字段等等>以一个小写字母开头,这个标识符的对象对包外不可见,但在包内是可见并可用的
- 包可以用作命名空间使用,避免命名冲突
程序的基本结构
- 函数体使用{}包裹起来,左大括号{必须与函数的声明放在同一行。强制规定,否则报错
- 函数体的}右大括号需要紧紧的跟着函数体的下一行
- 原因:因为go看似不需要; 其实这一过程是由编译器完成,如果不紧跟{ 编译器会默认加上;导致出错
类型
- 基本数据类型:int,float,bool,string
- 结构化:struct,array,slice,map,channel
- 描述类型的行为:interface
- 结构化的类型没有真正的值,使用nil作为默认值
- go语言中不存在类型继承
当参数返回个数为一个时,直接写类型,当参数返回个数为多个时,写为(a1 type1,a2 type2)
// 一个返回值
func FunctionName() int{
return 1
}
// 多个返回值
func FunctionName() (a string,b int){
return "1",2
}
type 定义自己的类型
- 使用type变量可以自定义结构体,也可以定义已有类型的别名
type IZ int
这里并不是真正意义上的别名,因为使用这种方式定义后类型可以拥有更多的特性,且在类型转换时必须显示转化
类型转化
- go语言中不存在隐式类型转化,所有转化都必须显示说明
go程序的基本书写结构
- 在完成包的 import 之后,开始对常量、变量和类型的定义或声明。
- 如果存在 init 函数的话,则对该函数进行定义(这是一个特殊的函数,每个含有该函数的包都会首先执行这个函数)。
- 如果当前包是 main 包,则定义 main 函数。
- 然后定义其余的函数,首先是类型的方法,接着是按照 main 函数中先后调用的顺序来定义相关函数,如果有很多函数,则可以按照字母顺序来进行排序。
go程序的执行顺序
- 按顺序导入所有被main包导入的其他包,然后每个包中执行如下流程
- 如果该包中又导入了其他包,递归执行第一步,但是每个包只会导入一次
- 然后以相反的顺序为每个包中初始化常量和变量<跟栈的顺序相同>,如果该包含有init函数的话,则调用该函数
- 在完成这一切之后,main也执行相同的过程,最后调用main函数开始执行程序