golang基础
变量类型
下面是Golang中变量类型的分类和示例,整理成表格形式:
基本类型
类型 | 示例代码 | 说明 |
---|---|---|
布尔类型 | var b bool = true | 布尔值,取值为true 或false |
整数类型 | var i int = 10 | 有符号整数 |
无符号整数 | var u uint = 20 | 无符号整数 |
int8 | var i8 int8 = -128 | 8位有符号整数 |
uint8 | var ui8 uint8 = 255 | 8位无符号整数 |
int16 | var i16 int16 = 32767 | 16位有符号整数 |
uint16 | var ui16 uint16 = 65535 | 16位无符号整数 |
int32 | var i32 int32 = 2147483647 | 32位有符号整数 |
uint32 | var ui32 uint32 = 4294967295 | 32位无符号整数 |
int64 | var i64 int64 = 9223372036854775807 | 64位有符号整数 |
uint64 | var ui64 uint64 = 18446744073709551615 | 64位无符号整数 |
浮点数类型 | var f32 float32 = 3.14 | 32位浮点数 |
浮点数类型 | var f64 float64 = 2.718 | 64位浮点数 |
复数类型 | var c64 complex64 = 1 + 2i | 64位复数 |
复数类型 | var c128 complex128 = 3 + 4i | 128位复数 |
字符串类型 | var s string = "Hello, Go" | 字符串 |
复合类型
类型 | 示例代码 | 说明 |
---|---|---|
数组 | var arr [5]int = [5]int{1, 2, 3, 4, 5} | 固定长度的相同类型元素的集合 |
切片 | var slice []int = []int{1, 2, 3, 4, 5} | 动态数组 |
字典 (Map) | var m map[string]int = map[string]int{"one": 1, "two": 2} | 键值对的集合 |
结构体 | type Person struct { Name string; Age int } | 自定义类型的集合 |
指针 | var ptr *int; var x int = 10; ptr = &x | 指向某个变量地址的变量 |
函数 | var f func(int) int; f = func(x int) int { return x * x } | 函数类型 |
接口 | type Stringer interface { String() string } | 定义一组方法的集合 |
常量类型
类型 | 示例代码 | 说明 |
---|---|---|
常量 | const pi float64 = 3.1415 | 定义后值不可更改 |
批量常量声明 | const (Sunday = 0; Monday = 1; Tuesday = 2) | 批量声明多个常量 |
示例代码
类型转换
在Go语言(Golang)中,类型转换(Type Conversion)用于将一种数据类型的值转换为另一种数据类型的值。Go语言不支持隐式类型转换,所有的类型转换都必须显式指定。以下是一些常见的类型转换方式和示例。
基本数据类型的转换
在Go中,可以使用类型名作为函数来进行类型转换。例如:
字符串和数值类型之间的转换
在Go中,字符串和数值类型之间的转换可以通过标准库中的 strconv
包实现。
自定义类型的转换
Go语言允许定义自定义类型,并且可以通过显式转换在这些类型之间进行转换。
接口类型的转换
在Go中,接口类型的转换可以通过类型断言(type assertion)和类型开关(type switch)实现。
类型断言
类型断言用于将接口类型转换为具体类型。
类型开关
类型开关用于根据接口变量的具体类型执行不同的操作。
字符串格式化
在Go语言中,字符串格式化有几种常见的方法,以下是每种方法的示例:
1. 使用 fmt.Sprintf
这是Go语言中最常用的字符串格式化函数。
2. 使用 fmt.Printf
这种方法适用于直接输出格式化的字符串。
3. 使用 fmt.Fprintf
这种方法适用于将格式化字符串写入到一个 io.Writer
接口(例如文件或网络连接)。
4. 使用 strings.Builder
对于大量的字符串拼接和构建,strings.Builder
提供了更高效的方法。
5. 使用字符串拼接
对于简单的字符串拼接,可以直接使用 +
运算符。
变量定义
在Golang中,变量的定义有多种方式,主要包括显式类型声明、隐式类型声明、批量声明和短变量声明。以下是详细介绍:
1. 显式类型声明
这是最基本的变量定义方式,明确指定变量的类型。
2. 隐式类型声明
Go支持根据初始值自动推断变量类型,因此可以省略类型声明。
3. 短变量声明
这是Go特有的一种简洁的变量声明方式,常用于函数内部。这种方式只能用于函数内部,不能用于全局变量。
4. 批量声明
可以在一个声明语句中定义多个变量。
或者使用批量声明并赋值:
5. 常量声明
常量的值在程序运行时不能改变。常量声明可以显式指定类型,也可以使用隐式类型。
批量声明常量:
6. 全局变量
全局变量可以在包级别声明,通常在包的最上方。
示例代码
以下是一个示例代码,展示了上述各种变量声明方式的使用:
条件判断
在Golang中,判断语句主要包括if
语句和switch
语句。下面是这些语句的详细介绍和示例。
if
语句
if
语句用于根据条件执行代码块。
基本语法
带有else
的if
语句
多个条件判断
示例代码
switch
语句
switch
语句用于基于多个条件值执行不同的代码块。
基本语法
switch
语句中的表达式
switch
语句也可以基于表达式的结果进行判断。
示例代码
循环
在Golang中,循环语句主要包括for
循环。Go语言只有一种循环结构,即for
循环,但它可以通过不同的方式使用来实现多种循环功能,例如普通的for循环、基于条件的循环、和无限循环。下面是这些循环语句的详细介绍和示例。
基本的 for
循环
语法
示例
基于条件的 for
循环
语法
示例
无限循环
语法
示例
for
循环遍历数组、切片、map 和字符串
数组和切片
Map
字符串
函数
在Golang中,函数是代码组织和重用的基本单位。函数定义包括函数名、参数列表、返回值类型以及函数体。下面是Go中函数定义的详细介绍和示例。
基本函数定义
语法
示例
多返回值函数
Go函数可以返回多个值,这在处理错误时非常有用。
示例
命名返回值
Go允许为返回值命名,这样可以在函数体内直接使用这些变量,并且可以使用return
关键字返回所有命名返回值。
示例
匿名函数和闭包
匿名函数是在没有名字的情况下定义的函数,闭包是引用了其外围作用域中变量的函数。
示例
变参函数
变参函数可以接受不定数量的参数。
示例
方法
方法是绑定到特定类型的函数。
示例
组合
在Golang中,继承不是通过类和子类来实现的,因为Go没有传统的类继承机制。相反,Go通过组合和接口来实现代码复用和多态性。
组合
组合是一种包含一个或多个其他结构体类型的字段,从而实现类似于继承的效果。
示例
在这个示例中,Employee
结构体嵌入了Person
结构体,从而可以直接访问Person
的字段,就像传统的继承一样。
接口
接口定义了一组方法,任何实现了这些方法的类型都被认为实现了该接口。接口用于实现多态性。
示例
在这个示例中,Person
和Employee
都实现了Describer
接口的Describe
方法,因此它们可以作为Describer
类型使用。
多态性
通过组合和接口,Go实现了多态性,可以根据实际类型调用相应的方法。
示例
在这个示例中,printDescription
函数接受一个Describer
接口类型的参数,因此它可以处理任何实现了Describer
接口的类型。
错误处理
在Golang中,错误处理是一种显式的、结构化的方式,主要通过返回错误值来处理。Go语言没有异常机制,而是通过返回值的方式处理错误。以下是Go语言中错误处理的详细介绍和示例。
错误类型
Go语言中,错误类型是内置的接口类型error
,它定义如下:
任何实现了Error()
方法的类型都可以作为错误类型。
创建错误
可以使用errors
包中的New
函数创建一个简单的错误:
返回错误
函数通常会返回一个error
类型的值来表示是否发生了错误。返回值可以是nil
,表示没有错误。
示例
自定义错误类型
可以定义一个自定义的错误类型,通过实现Error()
方法来满足error
接口。
示例
包装错误
可以使用fmt.Errorf
来格式化和包装错误信息。
示例
通过errors
包检查和比较错误
Go 1.13引入了errors.Is
和errors.As
函数,用于错误检查和比较。
示例
项目结构
在Golang中,项目结构的设计是开发过程中一个非常重要的部分。一个良好的项目结构可以提高代码的可维护性和可扩展性。以下是一个典型的Go项目结构以及每个部分的说明和示例。
典型的Go项目结构
目录和文件说明
-
bin/
:编译后的二进制文件目录。可以通过构建脚本将编译输出设置到此目录。 -
cmd/
:存放项目的主要应用入口。每个子目录代表一个可独立构建和运行的应用。cmd/myapp/main.go
:项目的主要入口文件,包含main
函数。
-
pkg/
:存放可供其他项目使用的库代码。pkg/mypackage/
:一个公共包,包含主要功能代码和测试文件。
-
internal/
:存放私有包,这些包仅对本项目可见,其他项目无法导入。internal/myinternalpackage/
:一个内部包,包含内部功能代码和测试文件。
-
api/
:存放API相关代码,通常用于定义API路由和处理请求。api/v1/
:API的v1版本目录。api/v1/api.go
:API的实现文件。api/v1/api_test.go
:API的测试文件。
-
web/
:存放Web相关资源,包括静态文件和模板。web/static/
:静态文件目录。web/templates/
:模板文件目录。
-
scripts/
:存放构建、安装、分析等操作的脚本。scripts/build.sh
:构建脚本。
-
configs/
:存放配置文件。configs/config.yaml
:配置文件示例。
-
deployments/
:存放部署相关文件。deployments/deployment.yaml
:Kubernetes部署文件示例。
-
test/
:存放测试相关文件。test/e2e/
:端到端测试文件目录。test/integration/
:集成测试文件目录。
-
go.mod
:模块依赖管理文件,定义项目的模块名称和依赖项。 -
go.sum
:记录所有依赖项的精确版本和校验和。
示例代码
cmd/myapp/main.go
pkg/mypackage/mypackage.go
pkg/mypackage/mypackage_test.go
其他常见目录结构
根据项目的规模和需求,项目结构可以有所不同。以下是一些常见的项目结构变化:
-
小型项目:不需要复杂的目录结构,可以直接在根目录下放置所有代码。
-
大型项目:可以引入更多的目录层次和模块划分。