一、变量
- 什么是变量
- 变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。
- 变量的本质就是一小块内存,用于存储数据,在程序运行过程中数值可以改变
- 变量可以通过变量名访问
- 声明变量的规则
- 以字母或下划线开头,由一个或多个字母、数字、下划线组成
- 关键字
- var
- 定义变量
- 注意Go语言变量一旦定义后续必须要用到,否则会报错
- 定义变量格式:
- var 变量名 变量类型
var a int
var s string
- 变量赋值
- var 变量名 变量类型 = 值
- 根据值自行判定变量类型。
- 在函数内第一次赋值时可以使用:=替代var来定义赋值变量(在函数外不可以),编译器也可以自动决定类型
- 在函数外定义变量是包内变量(不是全局变量)
- 如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误
var a int = 5
var b string = "abbc"
var c,d,e,f = 3,5,true,"def" //不需要显示声明类型,自动推断
- 变量赋值与其他主流语言的区别
- 赋值可以进行自动类型推断
- 在一个赋值语句中可以对多个变量进行同时赋值(拿两个变量交换值举例)
func TestExchange(t *testing.T) {
a := 1
b := 2
//定义中间变量进行变量值的互换
//tmp := a
//a = b
//b = tmp
//在Go中可以这么写
a, b = b, a
t.Log(a, b)
}
- 创建一个test文件,编写测试程序
- 源码文件以_test结尾:xxx_test.go
- 测试方法名以Test开头: func TestXXX(t *testing.T){...}
二、常量
- 什么是常量
- 常量是一个简单值的标识符,在程序运行时,不会被修改的量。
- 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
- 常量还可以用作枚举
- 关键字 const
- const可以作为各种类型进行使用
const a,b = 3,4
var c int = int(math.Sqrt(a*a + b*b))
- 变量赋值与其它主流语言的区别
- 与其他语言差异不大
- Go语言可以快速设置连续值 例:
const (
Monday = iota + 1
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
)
func TestConstant(t *testing.T) {
t.Log(Thursday, Sunday) //输出结果为:4 7
}
//iota,特殊常量值,是一个系统定义的可以被编译器修改的常量值。
//iota只能被用在常量的赋值中,在每一个const关键字出现时,被重置为0,
//然后每出现一个常量,iota所代表的数值会自动增加1,
//iota可以理解成常量组中常量的计数器,不论该常量的值是什么,只要有一个常量,那么iota 就加1。
还可以很方便的做状态位的标识位
const (
Readable = 1 << iota
Writable
Executable
)
func TestConstant1(t *testing.T) {
a := 7 //0111
//与运算
t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable) //输出结果 true true true
b := 1 //0001
t.Log(b&Readable == Readable, b&Writable == Writable, b&Executable == Executable) //输出结果 true false false
}
三、数据类型
在 Go 编程语言中,数据类型用于声明函数和变量。
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。
- 布尔型
- 布尔型的值只可以是true或者false
- 数字类型
- 整型int、浮点型float32,float64 GO语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码
- 字符串类型
- 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
- 派生类型
- 指针类型(Pointer)
- 数组类型
- 结构化类型(struct)
- Channel 类型
- 函数类型
- 切片类型
- 接口类型(interface)
- Map 类型
- 数值范围
类型 | 长度(字节) | 数值范围 |
---|---|---|
int8 | 1 | -128~127 (-2^(8-1) ~ 2^7-1) |
uint8 | 1 | 0~255 (0 ~ 2^8-1) |
int16 | 2 | -32768~32767 |
uint16 | 2 | 0~65535 |
int32 | 4 | -2^31 ~ 2^31-1 (-2147483648~2147483647) |
uint32 | 4 | 0~ 2^32-1 (0~4294967295) |
int64 | 8 | -2^63 ~2^63-1 |
uint64 | 8 | 0~2^63 |
-
零值(初始值)
- 当一个变量或者新值被创建时, 如果没有为其明确指定初始值,go语言会自动初始化其值为此类型对应的零值, 各类型零值如下:
- bool :false
- integer :0
- float :0.0
- string:""
- pointer, function, interface, slice, channel, map:nil
- 对于复合类型, go语言会自动递归地将每一个元素初始化为其类型对应的零值。比如:数组, 结构体 。
- 当一个变量或者新值被创建时, 如果没有为其明确指定初始值,go语言会自动初始化其值为此类型对应的零值, 各类型零值如下:
-
与其他主流编程语言的差异
- Go语言不允许隐式类型转换
- 别名和原有类型也不能进行隐式类型转换
- string 是值类型。默认初始化值是空字符串,不是nil
- 不支持指针运算
type MyInt int64
func TestImplicit(t *testing.T) {
var a int32 = 1
var b int64
//b = a //报错
b = int64(a) // √
t.Log(b)
}