Golang学习笔记_04——递归函数
Golang学习笔记_05——延迟调用
Golang学习笔记_06——变量和常量
文章目录
- 基本类型
- 1. 介绍
- 2. 类型转换
- 3. 类型推断
- 4. 示例
- 2. 零值
- 2.1 定义
- 2.2 特性
- 2.3 各类数据类型的零值
- 2.4 零值的用途
- 2.5 零值 && nil 比较
- 2.6 示例
- 源码
基本类型
1. 介绍
- 布尔类型(Boolean Type)
- 类型关键字:
bool
- 取值范围:
true
或false
- 类型关键字:
- 整数类型(Integer Types)
- 有符号整数:
int8
,int16
,int32
,int64
,以及int
(根据平台不同,通常为32位或64位) - 无符号整数:
uint8
,uint16
,uint32
,uint64
, 以及uintptr
(无符号整数,足以存储指针) - 其他:
rune
(等价于int32
,用于表示Unicode码点)和byte
(等价于uint8
,用于表示字节)
- 有符号整数:
- 浮点类型(Floating-point Types)
- 类型关键字:
float32
和float64
- 取值范围:
float32
是32位浮点数,float64
是64位浮点数
- 类型关键字:
- 复数类型(Complex Types)
- 类型关键字:
complex64
和complex128
- 取值范围:
complex64
是由两个float32
组成的复数,complex128
是由两个float64
组成的复数
- 类型关键字:
2. 类型转换
表达式 T(v)
将值 v
转换为类型 T
。
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
简短形式
i := 42
f := float64(i)
u := uint(f)
3. 类型推断
在声明一个变量而不指定其类型时(即使用不带类型的 :=
语法 var =
表达式语法),变量的类型会通过右值推断出来。
var i int
j := i // j 也是一个 int
当右边包含未指明类型的数值常量时,新变量的类型就可能是 int
、float64
或 complex128
了,这取决于常量的精度
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
4. 示例
var (ToBe bool = falseMaxInt uint64 = 1<<64 - 1z complex128 = cmplx.Sqrt(-5 + 12i)
)func showDataType() {// 布尔类型var isGoFun bool = truefmt.Printf("类型:%T 值:%v\n\n", isGoFun, isGoFun)// 整数类型var num int = 42fmt.Printf("类型:%T 值:%v\n\n", num, num)// 浮点类型var pi float64 = 3.14fmt.Printf("类型:%T 值:%v\n\n", pi, pi)// 复数类型var complexNum complex128 = 1 + 2ifmt.Printf("类型:%T 值:%v\n\n", complexNum, complexNum)fmt.Printf("类型:%T 值:%v\n", ToBe, ToBe)fmt.Printf("类型:%T 值:%v\n", MaxInt, MaxInt)fmt.Printf("类型:%T 值:%v\n", z, z)}
测试方法
func Test_showDataType(t *testing.T) {showDataType()
}
输出结果
=== RUN Test_showDataType
类型:bool 值:true类型:int 值:42类型:float64 值:3.14类型:complex128 值:(1+2i)类型:bool 值:false
类型:uint64 值:18446744073709551615
类型:complex128 值:(2+3i)
--- PASS: Test_showDataType (0.00s)
PASS
2. 零值
在Go语言中,零值(Zero Value)是一个非常重要的概念。它是指在声明变量但没有显式赋值的情况下,变量会被自动赋予的一个默认值。这个默认值取决于变量的类型,不同类型的变量会有不同的零值。
2.1 定义
零值是Go语言在声明变量时,如果未显式赋值,则自动赋予该变量的一个默认值。
2.2 特性
零值确保了变量在声明后具有一个可预测的初始状态,避免了未初始化变量可能引发的潜在问题。这有助于编写更加健壮和可靠的代码。
2.3 各类数据类型的零值
- 数值类型
- 有符号整数(如int、int8、int16、int32、int64):零值为0。
- 无符号整数(如uint、uint8、uint16、uint32、uint64):零值也为0。
- 浮点数(如float32、float64):零值为0.0。
- 布尔类型
- 布尔类型(bool):零值为false。
2.4 零值的用途
- 初始化变量:在声明变量时,可以使用零值来初始化变量,确保它们具有一个确定的初始状态。
- 值比较:在比较变量的值时,可以将其与对应类型的零值进行比较,以确定变量是否已被赋值或修改。
- 清空变量:有时候需要清空一个变量的值,可以将其赋值为对应类型的零值。
- 初始化数据结构:在定义复合数据类型(如结构体、数组、切片等)时,可以使用零值来初始化其元素或字段。
2.5 零值 && nil 比较
尽管在某些情况下nil和零值可能表现得相似(例如,nil切片和零值切片都表示空切片),但它们代表了不同的概念:
- nil是一个特殊的值,通常用于表示指针、切片、映射、通道和接口等数据结构的未初始化状态。
- 零值是指在声明变量但未显式赋值时,变量会自动被赋予的默认值。这个默认值取决于变量的类型。
了解nil和零值的区别有助于编写更加清晰和可读性强的代码。
2.6 示例
func showZeroValue() {var i intvar f float64var b boolvar s stringfmt.Printf("类型:%T 值:%v\n\n", i, i)fmt.Printf("类型:%T 值:%v\n\n", f, f)fmt.Printf("类型:%T 值:%v\n\n", b, b)fmt.Printf("类型:%T 值:%v\n\n", s, s)
}
测试方法
func showZeroValue() {var i intvar f float64var b boolvar s stringfmt.Printf("类型:%T 值:%v\n\n", i, i)fmt.Printf("类型:%T 值:%v\n\n", f, f)fmt.Printf("类型:%T 值:%v\n\n", b, b)fmt.Printf("类型:%T 值:%v\n\n", s, s)
}
输出结果
=== RUN Test_showZeroValue
类型:int 值:0类型:float64 值:0类型:bool 值:false类型:string 值:--- PASS: Test_showZeroValue (0.00s)
PASS
源码
// basic_data_type.go 文件
package basic_data_type_demoimport ("fmt""math/cmplx"
)var (ToBe bool = falseMaxInt uint64 = 1<<64 - 1z complex128 = cmplx.Sqrt(-5 + 12i)
)func showDataType() {// 布尔类型var isGoFun bool = truefmt.Printf("类型:%T 值:%v\n\n", isGoFun, isGoFun)// 整数类型var num int = 42fmt.Printf("类型:%T 值:%v\n\n", num, num)// 浮点类型var pi float64 = 3.14fmt.Printf("类型:%T 值:%v\n\n", pi, pi)// 复数类型var complexNum complex128 = 1 + 2ifmt.Printf("类型:%T 值:%v\n\n", complexNum, complexNum)fmt.Printf("类型:%T 值:%v\n", ToBe, ToBe)fmt.Printf("类型:%T 值:%v\n", MaxInt, MaxInt)fmt.Printf("类型:%T 值:%v\n", z, z)}func showZeroValue() {var i intvar f float64var b boolvar s stringfmt.Printf("类型:%T 值:%v\n\n", i, i)fmt.Printf("类型:%T 值:%v\n\n", f, f)fmt.Printf("类型:%T 值:%v\n\n", b, b)fmt.Printf("类型:%T 值:%v\n\n", s, s)
}
// basic_data_type_test.go 文件
package basic_data_type_demoimport "testing"func Test_showDataType(t *testing.T) {showDataType()
}func Test_showZeroValue(t *testing.T) {showZeroValue()
}