Go
Go
基本语法
数据类型
Golang 中的数据类型包括基本数据类型和复合数据类型。
基本数据类型
Golang 中的基本数据类型包括:
- 布尔类型:bool,取值为 true 或 false。
- 数值类型:包括整数类型和浮点数类型。
- 整数类型:int8、int16、int32、int64、uint8、uint16、uint32、uint64、int、uint、uintptr。
- 浮点数类型:float32、float64。
- 字符串类型:用于表示文本数据。
- 字符类型:用于表示单个字符,使用 rune 类型表示。
- 错误类型:用于表示错误信息,通常用于函数返回值。
复合数据类型
Golang 中的复合数据类型包括:
- 数组类型:用于表示一组固定长度的数据。
- 切片类型:用于表示一组长度可变的数据。
- 映射类型:用于表示一组键值对的数据。
- 结构体类型:用于表示一组相关的数据。
- 接口类型:用于表示一组方法的集合。
流程控制
Golang 中的流程控制语句包括:
- 条件语句:if 语句、switch 语句。
- 循环语句:for 语句。
- 跳转语句:break 语句、continue 语句、goto 语句。
条件语句
if 语句用于根据条件执行不同的代码块,语法如下:
if initialization; condition {
// code block
} else if initialization; condition {
// code block
} else {
// code block
}
initialization
的作用域覆盖 if-else 所有分支
switch 语句用于根据不同的条件执行不同的代码块,语法如下:
switch expression {
case value1:
// code block
case value2:
// code block
default:
// code block
}
循环语句
for 语句用于循环执行一段代码,语法如下:
for initialization; condition; post {
// code block
}
其中,initialization 用于初始化循环变量,condition 用于判断循环是否继续,post 用于更新循环变量。
跳转语句
break 语句用于跳出循环,continue 语句用于跳过当前循环,goto 语句用于无条件跳转到指定的标签处。
for i := 0; i < 10; i++ {
if i == 5 {
break
}
if i == 3 {
continue
}
fmt.Println(i)
}
goto label
// code block
label:
// code block
总的来说,Golang 中的流程控制语句包括条件语句、循环语句和跳转语句,可以根据实际情况选择合适的语句进行控制程序的流程。
变量声明
在 Golang 中,变量声明可以使用 var 关键字或短变量声明(:=)。
使用 var 关键字声明变量的语法如下:
var variable_name data_type
其中,variable_name 为变量名,data_type 为变量的数据类型。
例如,声明一个整数变量 x:
var x int
可以在声明变量的同时进行初始化,语法如下:
var variable_name data_type = initial_value
例如,声明一个整数变量 x 并初始化为 10:
var x int = 10
使用短变量声明(:=)可以更简洁地声明变量并进行初始化,语法如下:
variable_name := initial_value
例如,声明一个整数变量 x 并初始化为 10:
x := 10
需要注意的是,短变量声明只能用于函数内部,而 var 关键字可以用于函数内部和外部。另外,Golang 中的变量声明必须使用,否则会编译错误。
并发编程
Golang 是一门天生支持并发编程的语言,它提供了丰富的并发编程机制,包括 goroutine、channel、select 等。以下是 Golang 并发编程的一些基本概念和使用方法:
Goroutine
Goroutine 是 Golang 中的轻量级线程,可以在一个程序中同时运行多个 Goroutine,每个 Goroutine 都是独立的执行流程。Goroutine 的创建和启动非常简单,只需要在函数调用前加上 go 关键字即可,例如:
go func() {
// code block
}()
Channel
Channel 是 Golang 中的一种通信机制,用于在 Goroutine 之间传递数据。Channel 有两种类型:带缓冲的 Channel 和不带缓冲的 Channel。带缓冲的 Channel 可以缓存一定数量的数据,当缓存满时,发送方会被阻塞,直到接收方取走数据。不带缓冲的 Channel 在发送和接收数据时都会被阻塞,直到有对应的接收或发送操作为止。
创建 Channel 的语法如下:
ch := make(chan data_type)
发送数据到 Channel 的语法如下:
ch <- data
从 Channel 接收数据的语法如下:
data := <-ch
Select
Select 语句用于在多个 Channel 之间进行选择,当有一个 Channel 可以进行发送或接收操作时,就会执行对应的代码块。Select 语句可以用于实现超时、非阻塞等功能。
Select 语句的语法如下:
select {
case data := <-ch1:
// code block
case data := <-ch2:
// code block
default:
// code block
}
以上是 Golang 并发编程的一些基本概念和使用方法,需要注意的是,在并发编程中需要注意线程安全和数据竞争等问题,可以使用锁、原子操作等机制来解决这些问题。
对象声明
在 Golang 中,new 和 make 都是用于创建新的数据结构的内置函数,但是它们的作用不同。
new 用于创建一个指定类型的指针,并返回该指针的地址。new 的语法如下:
ptr := new(data_type)
其中,data_type 为指定的数据类型,ptr 为指向该数据类型的指针。
例如,创建一个整数类型的指针:
ptr := new(int)
make 用于创建一个指定类型的数据结构,并返回该数据结构的引用。make 只能用于创建 slice、map 和 channel 等数据结构,因为这些数据结构需要进行初始化才能使用。make 的语法如下:
ref := make(data_type, length, capacity)
其中,data_type 为指定的数据类型,length 为数据结构的长度,capacity 为数据结构的容量(仅适用于 slice 和 channel)。
例如,创建一个长度为 10、容量为 20 的整数类型的 slice:
s := make([]int, 10, 20)
需要注意的是,new 和 make 都是用于创建新的数据结构,但是它们的作用不同。new 用于创建指针类型的数据结构,而 make 用于创建 slice、map 和 channel 等数据结构。在使用 new 和 make 时,需要根据实际情况选择合适的函数,并进行适当的初始化。
在 Golang 中,数组和切片都是用于存储一组数据的数据结构,但是它们之间有很大的区别。
数组与切片
数组
数组是一组固定长度的数据结构,数组的长度在创建时就已经确定,不能动态改变。数组的元素类型可以是任意类型,但是所有元素的类型必须相同。数组的声明和初始化语法如下:
var array_name [length]data_type
其中,array_name 为数组名,length 为数组长度,data_type 为数组元素类型。
例如,创建一个长度为 5 的整数类型数组:
var a [5]int
切片
切片是一个动态长度的数据结构,可以根据需要动态增加或减少长度。切片的元素类型和数组类似,但是切片的长度可以动态改变。切片的声明和初始化语法如下:
var slice_name []data_type
其中,slice_name 为切片名,data_type 为切片元素类型。
例如,创建一个整数类型的切片:
var s []int
切片可以通过 make 函数进行初始化,语法如下:
slice_name := make([]data_type, length, capacity)
其中,length 为切片的长度,capacity 为切片的容量。
例如,创建一个长度为 5、容量为 10 的整数类型切片:
s := make([]int, 5, 10)
区别
数组和切片之间的主要区别如下:
长度:数组的长度在创建时就已经确定,不能动态改变,而切片的长度可以动态改变。
内存分配:数组在创建时就会分配一段连续的内存空间,而切片在创建时不会分配内存空间,只有在添加元素时才会动态分配内存空间。
传递方式:数组在函数调用时会进行值传递,即会复制一份数组,而切片在函数调用时会进行引用传递,即会传递切片的指针。
总的来说,数组和切片都是用于存储一组数据的数据结构,但是它们之间的区别很大,需要根据实际情况选择合适的数据结构。