典型的Go文件布局
- package子句
- 任何import语句
- 实际代码
// 每个Go文件都以package子句开头,表示文件中的所有其余代码都属于“main”包
package main
// Go文件几乎总是有一个或多个import语句
import "fmt"
// 当程序运行时,首先运行“main”函数
func main() {
// 通过从“fmt”包调用“Println”函数来实现在终端上显示内容
fmt.Println("Hello, World!")
}
文件需要先引入其他包,然后才能使用其他包里包含的代码。
调用函数
调用函数,需要输入函数名,以及一对圆括号。
函数可以接收一个或多个参数,参数出现在函数名后面的圆括号中,多个参数用逗号分隔。
字符串
字符串是一系列字节,通常表示文本字符。
Go把双引号之间的文本视为字符串。
在字符串中,换行符、制表符和其他难以包含在程序代码中的字符可以用转义序列来表示:反斜杠后跟表示另一个字符的字符。
\n
表示换行符\t
表示制表符\"
表示双引号\\
表示反斜杠
fmt.Println("Hello, \nWorld!")
Hello,
World!
fmt.Println("Hello, \tWorld!")
Hello, World!
fmt.Println("\"\"")
""
fmt.Println("\\")
\
符文
Go的符文(rune)用于表示单个字符。
字符串字面量由双引号("")包围,rune字面量由单引号('')包围。
Go使用Unicode标准来存储rune,rune被保存为数字代码,而不是字符本身。
转义序列可以用在rune字面量中。
fmt.Println('a')
97
布尔值
布尔值只能是两个值中的一个:true 或 false。
数字
Go将整数和浮点数视为不同的类型,可以使用小数点来区分整数和浮点数。
运算符
算术运算符
赋值运算符
关系运算符
逻辑运算符
类型
Go是静态类型,它在程序运行之前就知道值的类型是什么,如果在错误的位置使用了错误的值类型,Go会给出一个错误消息。
可以通过reflect包的TypeOf函数查看类型:
fmt.Println(reflect.TypeOf(3.1415))
float64
基本类型
类型 | 长度 | 默认值 | 描述 |
---|---|---|---|
bool | 1 | false | |
byte | 1 | 0 | unit8 |
int,unit | 4,8 | 0 | 默认整数类型,保存数字。32或64 |
int8,unit8 | 1 | 0 | |
int16,unit16 | 2 | 0 | |
int32,unit32 | 4 | 0 | |
int64,unit64 | 8 | 0 | |
float32 | 4 | 0.0 | |
float64 | 8 | 0.0 | 默认浮点数类型,保存带小数部分的数字。 |
complex64 | 8 | ||
complex128 | 16 | ||
rune | 4 | 0 | |
unitptr | 4,8 | 0 | |
string | "" |
声明变量
Go中,变量是包含值的一块存储。
使用var关键字,后跟所需的名称以及变量将保存的值的类型。
变量声明标准格式:
var 变量名 变量类型
a. 后置变量类型
b. 变量命名规则遵循驼峰命名法
c. 声明变量后,系统会自动赋予该类型零值
d. 声明但未使用的变量会被视为错误
var quantity int
// 可以一次声明同意类型的多个变量
var length, width float64
var name string
初始化变量
声明变量后,可以使用=(单等号)为它分配该类型的值
quantity = 8
length, width = 1.2, 2.4
name = "hello go"
如果知道变量的值是什么,可以声明变量的同时进行赋值(声明变量并赋值)。
变量初始化标准格式
var 变量名 变量类型 = 表达式
var quantity int = 8
var length, width float64 = 1.2, 2.4
var name string = "hello go"
可以为现有变量分配新值,但他们必须是相同类型的值(分配的类型与声明的类型要匹配)。
如果在声明变量的同时为其赋值,通常可以在声明中省略变量类型,分配给变量的值的类型将用作该变量的类型。
变量初始化推导格式
var 变量名 = 表达式
var quantity = 8
var length, width = 1.2, 2.4
var name = "hello go"
变量初始化短格式
变量名 := 表达式
quantity := 8
length, width := 1.2, 2.4
name := "hello go"
短变量声明
- 在函数中,
:=
简洁赋值语句在明确类型的地方,可以用于替代var
定义。 - 函数外的每个语句都必须以关键字开始(
var
、func
、等等),:=
结构不能使用在函数外。
变量作用域
- 全局变量作用域为整个包
- 局部变量的作用域由花括号决定,任一变量的作用域仅在所处花括号内
零值
如果声明一个变量而没有给他赋值,该变量将包含其类型的零值。
- 数值类型的零值是 0
- 字符串类型的零值是空字符串 ""
- 布尔类型的零值是 false
命名规则
适用于变量、函数和类型的名称:
- 名称必须以字母开头,并且可以由任意数量的额外的字母和数字。
- 如果变量、函数或类型的名称以大写字母开头,则认为它是导出的,可以从当前包之外的包访问它。如果变量、函数或类型的名称是以小写字母开头的,则认为该名称是为导出的,只能在当前包中使用。
- 如果一个名称由多个单词组成,建议用驼峰形式命名。
转换
Go中的数学运算和比较运算要求包含的值具有相同的类型。如果类型不同,在运行代码时会报错。
转换,允许将值从一种类型转换为另一种类型。
数值类型(byte
,rune
, intX
, uintX
, floatX
)之间的转换需要通过类型强转来完成
var price int = 2
// float64:需要转换的类型 price:需要转换的值
float64(price)
var a int32 = 123
var b int64 = int64(a)
数值类型和string
之间的转换通过 标准库strconv
中提供的函数进行
// string 到 int
int, err := strconv.Atoi(string)
// string 到 int64
int64, err := strconv.ParseInt(string, 10, 64)
// int 到 string
string := strconv.Itoa(int)
// int64 到 string
string := strconv.FormatInt(int64, 10)