为什么使用GO
- 语法简单,容易上手
- 类型检查严格,安全性高
- 编译时,语法检查
- 交叉编译,Windows、iOS、Linux
- 天然支持高并发,goroutine+chanel
- 部署简单
变量
变量定义
var
通过关键词 var
//name 变量名 T变量类型
var name T
:=
val := 1
限制
- 定义变量,同时显示初始化变量值
- 不能指定变量类型
- 只能在函数内使用
批量声明
var (
name1 int
name2 string
name3 float32
)
tips:
1、不指明变量类型,编译时自行推导类型
2、变量声明就要使用,否则报错
3、变量已经被声明了,不能重复声明,否则报错
基本类型
- bool
- string
- int(随系统,一般是占用4个字节)、int8(占一个字节)、int16(占两个字节)、int32(占4个字节)、int64(占8个字节)
- uint(无符号整数)、uint8、uint16、uint32、uint64、uintptr
- byte //
uint8 的别名
- rune //
int32 的别名 代表一个 Unicode 码
- float32、float64
- complex64、complex128
有符号和无符号的区别:int8 范围 -128-127,uint8 范围:0-255
零值
当一个变量被声明之后,系统自动赋予它该类型的零值
- int => 0
- float => 0.0
- string => “”
- bool => false
- 指针 => nil
匿名变量
使用多重赋值
时,如果不需要在左值中接受变量
,可以使用匿名变量
比如下面这个例子:
package main
import (
"fmt"
"net"
)
func main() {
//conn, err := net.Dial("tcp", "127.0.0.1:8080")
//如果不想接收err的值,那么可以使用_表示,这就是匿名变量
conn, _ := net.Dial("tcp", "127.0.0.1:8080")
fmt.Println(conn)
}
匿名变量以“_”下划线表示
匿名变量不占用命名空间,也不会分配内存。匿名变量可以重复声明使用
“_”本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。
作用域
一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。
根据变量定义位置的不同,可以分为以下三个类型:
- 函数内定义的变量称为
局部变量
- 函数外定义的变量称为
全局变量
- 函数定义中的变量称为
形式参数
局部变量
在函数体内声明的变量称之为局部变量
,它们的作用域只在函数体内
,函数的参数和返回值变量都属于局部变量。
局部变量不是一直存在的,它只在定义它的函数被调用后存在,函数调用结束后这个局部变量就会被销毁。
package main
import (
"fmt"
)
func main() {
//声明局部变量 a 和 b 并赋值
var a int = 3
var b int = 4
//声明局部变量 c 并计算 a 和 b 的和
c := a + b
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}
全局变量
在函数体外声明的变量称之为全局变量
,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用
,当然,不包含这个全局变量的源文件需要使用“import”关键字引入全局变量所在的源文件之后才能使用这个全局变量。
全局变量声明必须以 var 关键字开头
,如果想要在外部包中使用全局变量的首字母必须大写
。
package main
import "fmt"
//声明全局变量
var c int
func main() {
//声明局部变量
var a, b int
//初始化参数
a = 3
b = 4
c = a + b
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}
Go语言程序中全局变量与局部变量名称可以相同,但是函数体内的局部变量会被优先考虑。
package main
import "fmt"
//声明全局变量
var bb float32 = 3.14
func main() {
bb := 3
fmt.Println(bb)
}
//执行结果 3
形参
在定义函数时函数名后面括号中的变量叫做形式参数
(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元
,也没有实际值。
形式参数会作为函数的局部变量来使用
。
package main
import (
"fmt"
)
//全局变量 a
var a int = 13
func main() {
//局部变量 a 和 b
var a int = 3
var b int = 4
fmt.Printf("main() 函数中 a = %d\n", a)
fmt.Printf("main() 函数中 b = %d\n", b)
c := sum(a, b)
fmt.Printf("main() 函数中 c = %d\n", c)
}
func sum(a, b int) int {
fmt.Printf("sum() 函数中 a = %d\n", a)
fmt.Printf("sum() 函数中 b = %d\n", b)
num := a + b
return num
}
基本类型
整型
Go语言同时提供了有符号和无符号的整数类型。
- 有符号整型:int、int8、int64、int32、int64
- 无符号整型:uint、uint8、uint64、uint32、uint64、uintptr
有符号整型范围:-2^(n-1) 到 2^(n-1)-1
无符号整型范围: 0 到 2^n-1
实际开发中由于编译器和计算机硬件的不同,int 和 uint 所能表示的整数大小会在 32bit 或 64bit 之间变化。
uint在硬件开发中使用
在二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用 int 和 uint
浮点型
Go语言支持两种浮点型数:
- float32 : 范围 约1.4e-45 到 约3.4e38
- float64 :范围约4.9e-324 到 约1.8e308
通常应该优先使用 float64 类型,因为 float32 类型的累计计算误差很容易扩散,并且 float32 能精确表示的正整数并不是很大。
布尔型
在Go语言中,以bool类型进行声明:
var 变量名 bool
布尔型数据只有true和false,且不能参与任何计算以及类型转换
字符类型
Go语言的字符有以下两种:
- 一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。
- 另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。
byte 类型是 uint8 的别名,rune 类型是int32的别名