## 命名规则
go语言中,函数名、变量名、常量名、方法名等所有的命名都遵循一个规则:一个名字必须以字母或下划线开头,后面可以跟任意数量的字母、下划线和数字(注意不要跟标点符号哦)。
go语言中关键字有25个,关键字不能用来做自定义名字,只能在特定语法中使用。
```go
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
```
go语言还有30多个预定义字,对应内建的数据类型、函数、常量。这种预定义字和关键字不一样,它本身具有一定的含义,但是go语言并没有禁止使用者用预定字来命名。一般情况,不要用预定义字做变量名、函数名等,避免造成语义混乱,甚至使用错误发生bug。
```go
内建常量: true false iota nil
内建类型: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error
内建函数: make len cap new append copy close delete complex real imag panic recover
```
## 变量
关键字`var`用来声明变量。go语言变量声明和其他语言有些不同,它将类型置于变量名后面。go语言声明变量的语法如下:
```go
var 变量名 变量类型 = 表达式
var 变量名 变量类型
var 变量名 = 表达式
```
其中`= 表达式`与`变量类型`是可以省略的。如果省略了`变量类型`,会根据表达式自动推导变量类型。比如`var s = "hello"`,变量`s`会自动推导为string型。如果省略了`= 表达式`,那么会用零值来初始化变量。数值类型变量对应的零值为0,string类型变量对应的零值为空字符串,布尔类型对应的零值为false,引用类型(map,slice,channel)和接口对应的零值为nil,结构体和数组对应的零值为是每个字段或者元素都为零值。
#### 一次声明多个变量
go语言支持一条语句中声明一组类型相同的变量,或者使用一组初始化表达式来声明一组变量。如果省略了类型,使用表达式来初始化,可以同时声明多个不同类型的变量。
```go
var a, b int // a,b均为int型变量
var a, b int, c bool // 这是错误的
var a, b, c = 1, 2, "helloworld" // int,int,bool
```
#### 简洁的声明变量
go语言中提供一个语法糖`:=`来使声明更为简洁。使用`:=`可以省略`var`关键字,但是它要求程序必须手动地给变量赋值。`:=`也可以同时给多个不同类型地变量赋初始值。(注意:`:=`只能用于局部变量,全局变量不可以使用)
```go
str := "helloworld"
str, flag := "helloworld", true
```
## 常量
常量是在编译期就确定值的表达式,在程序运行中常量是不可变的。它主要用来存储一些程序运行时不会变的数据,比如Π。常量只有三个种类的数据类型,string、bool和数字类型。go语言中使用`const`关键字来声明常量,声明常量的语法与定义变量的语法一样。
```go
const Π int = 3.14
const man = "男"
```
给常量赋值时不能使用自定义函数,因为常量的值在编译期就确定,而自定义函数在编译器是未知的,所以无法给常量赋值。而内建函数是可以的,比如`len()`。(什么`len()`就可以?我也不知道)
## 包
go语言中的包类似于其他语言的库或者模块,它多个go文件的集合。程序中可以通过导入包去调用包中的函数或者方法,而在包中可以通过函数名,类型名的大小写来控制外部包的访问权限。
go语言中通过`package`关键字来声明go文件所属的包(包声明语句必须在最前面),通过`import`关键字来导入外部包。
```go
package dao
import "fmt"
```
## main函数
main函数是go语言中必须有的函数,它是go程序的入口。
```go
func main() {
fmt.Println("helloworld")
}
```
## golang程序基本结构示例
```go
package main // 必要
import "fmt" // 导入程序中需要用到的外部包,非必要
func main() { // 必要
// 业务
fmt.Println("helloworld")
}
```