变量知识点
- 定义以及初始化变量
// 1.定义一个变量
var num int
num = 666
// 注意点: 在Go语言中, 输出整型只能使用%d, 不能使用%i
fmt.Printf("%d\n", num)
// 2.先定义再初始化
var num int
num = 888
fmt.Printf("%d\n", num)
var num int
num = 10
fmt.Printf("%d\n",num)
// 3.定义的同时初始化
var num int = 999
fmt.Printf("%d", num)
var num int = 10
fmt.Printf("%d\n",num)
// 4.定义的同时初始化, 并省略数据类型
var num = 999
fmt.Printf("%d\n", num)
// 在Go语言中, 可以利用%T输出变量的数据类型
fmt.Printf("%T\n", num)
var num = 10
fmt.Printf("%d\n",num)
// 5.定义的同时初始化, 并省略数据类型和var
:=做了两件事情 , 1.会先定义一个变量 2.给定义的变量赋值
在Go语言开发中非常非常非常常用
num := 666
fmt.Printf("%d\n", num)
num := 10
fmt.Printf("%d\n",num)
// 6.:=注意点
var num := 666 // 语法错误
num int := 666 // 语法错误
fmt.Printf("%d\n", num)
var num int = 666
// var num int
// num = 888
num := 888 // 重复定义
fmt.Printf("%d\n", num)
- 变量的连续定义
// 1.通过逗号定义多个变量
var a, b, c int
a = 123
b = 456
c = 789
fmt.Printf("%d,%d,%d\n", a, b, c)
// 2.通过变量组定义多个变量
var(
a int
b int
c int
)
a = 123
b = 456
c = 789
fmt.Printf("%d,%d,%d\n", a, b, c)
// 3.同时定义多个变量, 并且同时初始化
var a, b, c int = 10, 20, 30
var a, b, c = 10, 20, 30
a, b, c := 10, 20, 30
fmt.Printf("%d,%d,%d\n", a, b, c)
// 4.同时定义多个变量, 并且同时初始化
var(
a int = 10
b int = 20
c int = 30
)
var(
a = 10
b = 20
c = 30
)
fmt.Printf("%d,%d,%d\n", a, b, c)
局部变量与全局变量的关系
1.什么是局部变量?
1.1在C语言中写在{}中或者函数中或者函数的形参, 就是局部变量
1.2Go语言中的局部变量和C语言一样2.什么是全局变量?
2.1在C语言中写在函数外面的就是全局变量
2.2Go语言中的全局变量和C语言一样3.局部变量和全局变量的作用域
3.1在C语言中局部变量的作用域是从定义的那一行开始, 直到遇到}结束或者遇到return为止
3.2Go语言中局部变量的作用域和C语言一样
3.3在C语言中全部变量的作用域是从定义的那一行开始, 直到文件末尾为止
3.4Go语言中的全局变量, 只要定义了, 在定义之前和定义之后都可以使用4.局部变量和全局变量的生命周期
4.1在C语言中局部变量, 只有执行了才会分配存储空间, 只要离开作用域就会自动释放, C语言的局部变量存储在栈区
4.2Go语言局部变量的生命周期和C语言一样
4.3在C语言中全局变量, 只要程序一启动就会分配存储空间, 只有程序关闭才会释放存储空间, C语言的全局变量存储在静态区(数据区)
4.4Go语言全局变量的生命周期和C语言一样5.局部变量和全局变量的注意点
5.1在C语言中相同的作用域内, 不能出现同名的局部变量
5.2Go语言和C语言一样, 相同的作用域内, 不能出现同名的局部变量
5.3在C语言中相同的作用域内, 可以出现同名的全局变量
5.4在Go语言中相同的作用域内, 不能出现同名的全局变量6.特殊点
6.1在C语言中局部变量没有初始化存储的是垃圾数据, 在Go语言中局部变量没有初始化, 会默认初始化为0
6.2在C语言中全局变量没有初始化存储的是0, Go语言和C语言一样
6.3在Go语言中, 如果定义了一个局部变量, 但是没有使用这个局部变量, 编译会报错
6.4在Go语言中, 如果定义了一个全局变量, 但是没有使用这个全局变量, 编译不会报错
变量的一些注意点
- 1.相同的作用域内, 无论是全局变量还是局部变量, 都不能出现同名的变量
2.变量离开作用域就不能使用
3.局部变量如果没有使用, 编译会报错, 全局变量如果没有使用, 编译不会报错
4.:=只能用于局部变量, 不能用于全局变量
5.:=如果用于同时定义多个变量, 会有退化赋值现象
- 1.相同的作用域内, 无论是全局变量还是局部变量, 都不能出现同名的变量
//退化赋值
num := 123
// 如果通过:=定义多个变量, 但是多个变量中有的变量已经在前面定义过了, 那么只会对没有定义过的变量执行:=
// 而定义过的变量只执行=操作
num, value := 456, 789
fmt.Printf("%d, %d", num, value)
数据类型转换
- 在 GO 语言中,数据类型转换只有显示类型转换
// 1.没有隐式转换, 会报错
var num int = 3.14
// 2.不能对一个常量进行强制转换
var num int = int(3.14)
// 3.正确的做法
var num float64 = 3.14
var value int = int(num)
fmt.Printf("%d\n", value)
// 4.注意点:
// 4.1在Go语言中数据类型必须一模一样, 才能直接赋值
var num int32 = 666
var value int64 = int64(num)
//var value int32 = num
fmt.Printf("%d\n", value)
// 4.2特殊情况
byte --> uint8
var ch byte = 'a'
var num uint8 = ch
fmt.Printf("%c\n", num)
// rune --> int32
var ch rune = '李'
var num int32 = ch
fmt.Printf("%c\n", num)
// 4.3bool类型不能强制转换为整型
var flag bool = false
var num int = int(flag)
fmt.Printf("%d\n", num)
// 5.整型也可以通过T(v)转换为字符串类型, 但是在企业开发中不要这么干
var num int = 97
var str string = string(num)
fmt.Printf("%s\n", str)
- 数值类型转换为字符串类型,2种方式: 1) strconv.FormatXxx() ; 2) strconv.Itoa
1.strconv.FormatXxx()
var num int = 9
//第一个参数: 需要转换的整数, 必须是int64类型的
//第二个参数: 转换为多少进制的字符串
var str string = strconv.FormatInt(int64(num), 10) // "9"
var str string = strconv.FormatInt(int64(num), 2) // "1001"
fmt.Printf("%s\n", str)
var num float32 = 3.1234567890123456789
// 第一个参数: 需要转换的小数, 必须是float64类型的
// 第二个参数: 按照什么格式转换 'f'小数格式 'e' 指数的格式
// 第三个参数: 保留多少位小数, 传入-1按照原始类型的精度保留
// 第四个参数: 原始类型的标志 float32 --> 32 float64 --> 64
var str string = strconv.FormatFloat(float64(num), 'f', -1, 32) // "3.1234567"
var str string = strconv.FormatFloat(float64(num), 'f', -1, 64) // "3.123456789012345"
var str string = strconv.FormatFloat(float64(num), 'f', 2, 32) // "3.12"
fmt.Printf("%s\n", str)
var flag bool = false
var str string = strconv.FormatBool(flag) // "false"
fmt.Printf("%s\n", str)
2.strconv.Itoa
var num int = 1001
var str string = strconv.Itoa(int(num))
fmt.Printf("%s\n", str)
- 字符串类型转换为数值类型: 1) strconv.ParseXxx() ; 2) strconv.Atoi()
1.strconv.ParseXxx()
var str string = "1001"
// 第一个参数: 需要转换的字符串
// 第二个参数: 被转换的字符串保存的整数是多少进制的
// 第三个参数: 期望转换为多少位的整数(不一定准确), 换句话说就是要转换为多少位整数
// 注意点: 如果被转换的字符串超出了指定的长度会报错
// 返回值:
// 返回值的第一个: 转换之后的数值, 是int64类型
// 返回值的第二个: 如果转换成功返回nil, 如果转换失败就不是nil
// int8 -128~127
//num, err := strconv.ParseInt(str, 10, 8)
num, err := strconv.ParseInt(str, 2, 8)
if err != nil{
fmt.Printf("转换失败\n")
}else{
fmt.Printf("%d\n", num)
fmt.Printf("%T\n", num)
}
var str string = "3.1234567890123456789"
// 第一个参数: 需要转换的字符串
// 第二个参数: 要将字符串中的小数转换为单精度还是双精度, 单精度传入32, 双精度传入64
// 返回值:
// 第一个返回值: 转换之后的小数, float64类型
// 第二个返回值: 转换成功返回nil, 转换失败不为nil
//num, err := strconv.ParseFloat(str, 32)
num, err := strconv.ParseFloat(str, 64)
if err != nil{
fmt.Printf("转换失败\n")
}else{
//fmt.Printf("%f\n", num)
fmt.Println(num)
fmt.Printf("%T\n", num)
}
var str string = "false"
flag, err := strconv.ParseBool(str)
if err != nil{
fmt.Printf("转换失败\n")
}else{
// 注意点: 在Go语言中%t输出布尔类型
fmt.Printf("%t\n", flag)
fmt.Printf("%T\n", flag)
}
2.strconv.Atoi()
var str string = "1001"
num, err := strconv.Atoi(str)
if err != nil{
fmt.Printf("转换失败\n")
}else {
fmt.Printf("%d\n", num)
}
常量知识点
- 1.在C语言中可以通过const来定义常量
- 2.在Go语言中一样
- 3.格式:
const 变量名称 数据类型 = 值;
- 注意点:
- 数据类型可以省略, 但是const不能省略
2.定义常量不能使用 := , := 是专门用于定义局部变量的
3.定义局部变量没有使用, 编译会报错, 定义全局变量和常量没有使用, 不会报错
4.在Go语言中可以连续定义多个变量, 所以也可以连续定义多个常量
格式:
const 变量名称1, 变量名称2 数据类型 = 值1, 值2;
const(
变量名称1 数据类型 = 值1
变量名称2 数据类型 = 值2
)
- 在常量组中, 如果常量没有赋值, 那么默认值就是上一行的取值
const num1,num2,num3 = 1,2,3
const(
num5 = 4
num4 = 5
num6 = 6
)
fmt.Println(num5,num4,num6)
// 1.定义单个常量
const num int = 666
const num = 666
const num = 666
//num = 789
fmt.Printf("%d\n", num)
// 2.定义多个常量
const a, b, c int = 10, 20, 30
const a, b, c = 10, 20, 30
a = 666
b = 777
c = 888
//3.常量组的注意点
//在常量组中, 如果常量没有赋值, 那么默认值就是上一行的取值
const(
a = 666
b = 789
c
)
fmt.Printf("%d, %d, %d", a, b, c)
- 枚举常量: 定义方式是使用 const
1.C语言中的枚举本质就是一个整数
enum 枚举名 { 枚举元素1 = 值, 枚举元素2 = 值, …… };
2.Go语句中没有明确枚举的固定写法, 但是在企业开发中一般都会常量组的形式来表示枚举
const( 枚举元素 = 值 枚举元素 = 值 )
// 1.iota迭代器, 默认会从0开始递增
const(
male = iota
female = iota
yao = iota
)
// 2.只要常量组中出现了iota, 该常量组中后续的常量都会一次递增1
const(
male = iota
female
yao
)
// 3.如果常量组中的iota被打断了, 那么就不会继续递增了, 会按照常量组的默认方式处理(上一行的值)
const(
male = iota
female = 666
yao
)
// 4.如果常量组中的iota被打断了, 但是后续又被回复了, 那么前面有多少行就会递增多少
const(
male = iota
female = 666
yao = iota
)
输入输出函数
- 与 C 语言类似,不做赘述.