1. Go基本组成元素
文件名
Go 的源文件以 .go为后缀存储在计算机中,这些文件名均由小写字母组成,如scanner.go;如果文件名由多个部分组成,则使用下划线_对它们进行分隔,如scanner_test.go;文件名不包含空格或其他特殊字符;
一个源文件可以包含任意多行的代码,Go本身没有对源文件的大小进行限制;
标识符
标识符是编程时所使用的名字,用于给变量、常量、函数、类型、接口、包名等进行命名,以建立名称和使用之间的关系,Go语言标识符的命名规则:
- 只能由非空字母(Unicode)、数字、下划线(_)组成
- 只能以字母或下划线开头
- 不能是Go语言的关键字
- 避免使用Go语言预定义标识符
- 建议使用驼峰式
- 标识符区分大小写
Go 语言提供一些预先定义的标识符用来表示内置的常量、类型、函数,在自定义标识符时应避免使用:
- 内置常量:true、false、nil、iota
- 内置类型:bool、byte、rune、int、int8、int16、int32、int64、uint、uint8、unit16、unit32、unit64、uintptr、float32、float64、complex64、complex128、string、error
- 内置函数:make、len、cap、new、append、copy、close、delete、complex、real、imag、panic、recover
- 空白标识符:_
关键字
break | default | func | interface | select |
---|---|---|---|---|
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
字面量
字面量是值的表示方法,常用与对变量/常量进行初始化,主要分为:
- 标识基础数据类型值的字面量,如:0,1.1, true, 3+4i, ‘a’
- 构造自定义的复合数据类型的类型字面量,如:type interval int
- 用于表示符合数据类型值的复合字面量,用在构造array、slice、map、struct的值,如:{1,2,3}
操作符
- 算术运算符:+、-、*、/、%、++、—
- 关系运算符: >、>=、<、<=、==、!=
- 逻辑运算符: &&、||、!
- 位运算符: &、|、
- 赋值运算符: =、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
- 其他运算符: &(单目)、*(单目)、.(点)、-(单目)、…、<-
分割符
小括号(),中括号[],大括号{},分号;,逗号,
2. 声明
声明语句用于定义程序的各种实体对象,主要有:
- 声明变量的 var
- 声明常量的 const
- 声明函数的 func
- 声明类型的 type
3. 变量
变量是指对一块存储空间定义名称,通过名称对存储空间的内容进行访问或修改,使用var进行变量声明,常用的语法为:
- var 变量名 变量类型 = 值
定义变量并进行初始化,例如:var name string = “silence” - var 变量名 变量类型
定义变量使用零值进行初始化,例如:var age int - var 变量名 = 值
定义变量,变量类型通过值类型进行推导,例如:var isBoy = true - var 变量名1,变量名2,…,变量名n 变量类型
定义多个相同类型的变量并使用零值进行初始化,例如:var prefix, suffix string - var 变量名1,变量名2,…,变量名n 变量类型 = 值1,值2,…, 值n
定义多个相同类型的变量并使用对应的值进行初始化,例如:var prex, next int = 3, 4 - var 变量名1,变量名2,…,变量名n = 值1,值2,…,值n
定义多个变量并使用对应的值进行初始化,变量的类型使用值类型进行推导,类型可不相同,例如:var name,age = “silence”, 30 批量定义
var (
变量名1 变量类型1 = 值1
变量名2 变量类型2 = 值2
)
定义多个变量并进行初始化,批量复制中变量类型可省略
例如:``` var (name string = “silence” age int = 30
)
当一个变量被声明之后,系统自动赋予它该类型的零值:int为0,float为0.0,bool为false,string为空字符串,指针为nil。注意,所有的内存在Go中都是经过初始化的;
变量的命名规则
初始化表达式可以使用字面量、任何表达式、函数
<a name="9d72a989"></a>
### 简短声明,使用:= 赋值操作符
在函数内可以通过简短声明语句声明并初始化变量,可通过简短声明同时声明和初始化多个变量,需要注意操作符左侧的变量至少有一个未定义过
package main
import “fmt”
func main() { n1, n2 := 1, 2 fmt,Println(n1, n2)
n2, n3 := 22, 3
fmt.Println(n2, n3)
}
注意:在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,例如:a := 20 就是不被允许的,编译器会提示错误 no new variables on left side of :=, 但是 a = 20 是可以的,因为这是给相同的变量赋予一个新的值;
<a name="bf6bcf8f"></a>
### 赋值
可以通过赋值运算=更新变量的值,Go语言支持通过元组赋值同时更新多个变量的值,例如:n1, n2 = 1, 2,可用于两个变量的交换x, y = y, x
<a name="071d6907"></a>
## 4. 常量
常量用于定义不可被修改的值,需要在编译过程中进行计算,只能为基础的数据类型bool、数值、字符串,使用const进行常量申明,常用语法:
- const 常量名 类型 = 值<br />定义常量并进行初始化,例如:const pi float64 = 3.1415926
- const 常量名 = 值<br />定义常量,类型通过值类型进行推导,例如:const e = 2.7182818
- 批量定义<br />const (<br />常量名1 类型1 = 值1<br />常量名2 类型2 = 值2<br />)<br />定义多个常量并进行初始化,批量复制中变量类型可省略,并且除了第一个常量值外其他常量可同时省略类型和值,表示使用前一个常量的初始化表达式;<br />例如:
const (
name string = “silence” age int = 30
)
const (
name string = “silence” desc
)
<br />常量还可以用作枚举:
const (
a = iota // a = 0 b = iota // b = 1 c = iota // c = 2
)
<br />常量之间的运算,类型转换,以及对常量调用函数len、cap、real、imag、complex、unsafe.Sizeof得到的结果依然为常量;
<a name="819e4724"></a>
## 5. 作用域
作用域指变量可以使用的范围;go语言使用大括号显示的标识作用域范围,大括号内包含一连串的语句,叫做语句块;语句块可以嵌套,语句块内定义的变量不能在语句块外使用;
常见隐式语句块:
- 全语句块
- 包语句块
- 文件语句块
- if、switch、for、select、case 语句块
作用域内定义变量只能被声明一次且变量必须使用,否则编译错误,在不同作用域可定义相同的变量,此时局部将覆盖全局;
package main
import “fmt”
func main() { outer := 1 { inner := 2 fmt.Println(outer, inner) outer := 3 fmt.Println(outer, inner) } fmt.Println(outer) } ```
6. 注释
Go 支持两种注释方式,行注释和块注释:
行注释:以//开头;
块注释:以/开头,以/结尾;
7. 问题跟踪
最基本的问题跟踪方式为打印日志,我们可以fmt包中提供的Println、Print、Printf函数用于将信息打印到控制台,帮助我们进行问题调试;