Skip to main content

Go

David LiuAbout 7 min

Go

Golang 基本语法

数据类型

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)

区别

数组和切片之间的主要区别如下:

  1. 长度:数组的长度在创建时就已经确定,不能动态改变,而切片的长度可以动态改变。

  2. 内存分配:数组在创建时就会分配一段连续的内存空间,而切片在创建时不会分配内存空间,只有在添加元素时才会动态分配内存空间。

  3. 传递方式:数组在函数调用时会进行值传递,即会复制一份数组,而切片在函数调用时会进行引用传递,即会传递切片的指针。

总的来说,数组和切片都是用于存储一组数据的数据结构,但是它们之间的区别很大,需要根据实际情况选择合适的数据结构。