参考网站:go变量
变量的声明
Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。
关于静态类型语言与动态类型语言的区别
-
静态类型语言在编译时进行类型检查,即在代码编译的过程中就会检查变量的类型是否符合规定,如果不符合就会报错。因此,静态类型语言的代码在运行之前就已经确定了所有变量的类型,这样可以避免一些类型错误在运行时才被发现
-
动态类型语言在运行时进行类型检查,即在代码执行的过程中才会检查变量的类型是否符合规定,如果不符合就会报错。因此,动态类型语言的代码在运行时才会确定变量的类型,这样可以使程序更加灵活,但也会增加一些类型错误的风险
变量就是一段或者多段内存,用于存储数据
1、变量声明以关键字var开头,变量类型后置,行尾无须分号
var 变量名 变量类型
变量的命名规则遵循驼峰命名法,即首个单词小写,每个新单词的首字母大写
2、基本类型
- bool
- string
- int(随系统,一般是占用4个字节)、int8(占一个字节)、int16(占两个字节)、int32(占4个字节)、int64(占8个字节)
- uint(无符号整数)、uint8、uint16、uint32、uint64、uintptr
- byte // uint8 的别名(代表ASCII码的一个字符)
- rune // int32 的别名(代表一个UTF-8字符)
- float32、float64
- complex64(复数类型,由两个 float32 类型的实部和虚部组成)、complex128(复数类型,由两个 float64 类型的实部和虚部组成)
var z1 complex64 = complex(3.0, 4.0) // 创建一个 complex64 类型的复数
var z2 complex128 = complex(3.0, 4.0) // 创建一个 complex128 类型的复数
所有的内存在 Go 中都是经过初始化的。
3、不指明变量类型
var age = 1
像上面这种声明变量的方式,并没有指明类型,Go语言中,在编译时会自动推导类型
4、批量格式
var (
a int
b string
c []float32
)
5、 简短格式(最常用)
//i是变量名 1 是值(或者表达式)
i := 1
使用简短格式的限制:
- 定义变量,同时显式初始化
- 不能提供数据类型
- 只能用在函数内部
简短变量声明被广泛用于大部分的局部变量的声明和初始化,var 形式的声明语句往往用于需要显式指定变量类型的地方
匿名变量
使用多重赋值时,如果不需要在左值中接受变量,可以使用匿名变量
匿名变量以“_”下划线表示
匿名变量不占用命名空间,也不会分配内存。匿名变量可以重复声明使用
package main
import (
"fmt"
"net"
)
func main() {
conn, _ := net.Dial("tcp", "127.0.0.1:8080")
//匿名变量可以重复声明
conn1, _ := net.Dial("tcp", "127.0.0.1:8080")
// 匿名变量不可以直接开头
// _ :=1
fmt.Println(conn)
fmt.Println(conn1)
}
“_”本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。
作用域
go语言中根据变量定义位置的不同,可以分为以下三个类型:
- 函数内定义的变量称为局部变量
局部变量不是一直存在的,它只在定义它的函数被调用后存在,函数调用结束后这个局部变量就会被销毁
- 函数外定义的变量称为全局变量
全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写
- 函数定义中的变量称为形式参数
在定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值
形式参数会作为函数的局部变量来使用