在本章中,我们将深入探讨 Go 语言的结构。Go 语言以其简洁、高效和强大的并发模型而闻名,了解其基本结构对于编写高效的 Go 代码至关重要。
变量声明与赋值
变量声明
在 Go 语言中,变量声明使用 var 关键字。变量声明可以指定类型,也可以由编译器自动推断类型。例如:
var a int // 显式声明变量类型 var b = 42 // 自动推断变量类型
此外,Go 还提供了简短声明方式,使用 := 来声明并初始化变量:
c := 50 // 简短声明并初始化变量
变量作用域
Go 语言中的变量作用域分为包级别和函数级别。包级别的变量可以在整个包中访问,而函数级别的变量只能在其定义的函数内部访问。
-- -------------------- ---- -------
------- ----
------ -----
--- --------- - --- -- ------
---- ------ -
-------- -- --- -- -------
----------------------
---------------------
-常量声明
常量在 Go 中使用 const 关键字声明。常量一旦被赋值就不能再修改。
const Pi = 3.141592653589793238
// 多个常量的声明
const (
A = 1
B = 2
)数据类型
Go 语言支持多种数据类型,包括但不限于整型、浮点型、布尔型以及字符串等。
整型
Go 语言支持有符号和无符号整型。常见的整型包括 int, int8, int16, int32, int64 和 uint, uint8, uint16, uint32, uint64。
var i int = 100 var u uint = 200
浮点型
Go 语言中的浮点型包括 float32 和 float64。
var f float32 = 3.14 var d float64 = 2.71828
布尔型
布尔型只有两种取值:true 和 false。
var isTrue bool = true
字符串
Go 语言中的字符串是不可变的,使用双引号或反引号表示。
s1 := "Hello, World!" s2 := `This is a multi-line string.`
控制结构
Go 语言支持常见的控制结构,如条件语句和循环语句。
条件语句
Go 使用 if 和 switch 语句进行条件判断。
-- -------------------- ---- -------
--- -- --
-- --- -- -- -
------------------
- ---- -
-------------------
-
------ --- -- --------------------- --- -
---- -------------- ------------
-----------------
--------
------------------
-循环语句
Go 语言支持 for 循环,也允许使用 goto 语句跳转到标签。
-- -------------------- ---- -------
--- -- -
--- - -- -- - -- ---- --- -
--- -- -
-
------
----------------
-- -- ---- --
---- -----函数
函数是 Go 语言的基本构建块。函数可以返回一个或多个值,并且可以接受可变数量的参数。
定义与调用
func add(a int, b int) int {
return a + b
}
result := add(5, 3)
fmt.Println(result)多返回值
Go 允许函数返回多个值,这在处理错误时特别有用。
-- -------------------- ---- -------
---- --------- - ---- ----- ------ -
-- - -- - -
------ -- --------------------
-
------ - - -- ---
-
--------- --- -- ---------- --
-- --- -- --- -
----------------
- ---- -
---------------------
-可变参数
函数可以接受可变数量的参数,通过在参数类型后添加 ... 实现。
-- -------------------- ---- -------
---- -------- ------- --- -
----- -- -
--- -- --- -- ----- ---- -
----- -- ---
-
------ -----
-
------------------ -- -- ---数组与切片
数组和切片是 Go 语言中用于存储一组相同类型数据的数据结构。
数组
数组是一个固定长度的元素序列,所有元素必须是相同的类型。
var arr [5]int arr[0] = 1 arr[1] = 2 slice := arr[:3] // 创建一个切片,指向数组的前三个元素
切片
切片是对数组的一个连续片段的引用,它是一个动态的、灵活的数据结构。
nums := []int{1, 2, 3, 4, 5}
fmt.Println(nums)
// 切片操作
slice := nums[1:3]
fmt.Println(slice)映射
映射是一种关联键和值的数据结构。映射中的键是唯一的,但值可以重复。
-- -------------------- ---- -------
---- -- --------------------
------------- - --
----------- - --
---- ------ -- ---------------
-- ------- -
-------------------- -------
- ---- -
----------------
-
------------ -------- -- -----结构体
结构体是一种用户自定义的数据类型,它可以包含字段和方法。
定义与实例化
type Person struct {
Name string
Age int
}
p := Person{Name: "John", Age: 30}方法
在 Go 语言中,可以为结构体定义方法。
func (p Person) SayHello() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}
p.SayHello()接口
接口定义了一组方法签名,任何实现了这些方法的类型都可以被视为该接口的实现。
-- -------------------- ---- -------
---- ------- --------- -
----------
-
---- -------- ------ -
---- ------
-
---- -- --------- ---------- -
------------------ --- -- -------- ----- ------ -------
-
--- ------- ------- - -------------- -------
------------------并发编程
Go 语言内置了对并发的支持,主要通过 goroutines 和 channels 实现。
Goroutines
Goroutines 是轻量级线程,Go 语言通过启动一个新的 goroutine 来执行并发任务。
-- -------------------- ---- -------
---- ----- ------- -
--- - -- -- - - -- --- -
--------------------------- - ----
--------------
-
-
-- ------------
------------Channels
Channels 是在 goroutines 之间传递数据的安全通道。
ch := make(chan int, 2) ch <- 1 ch <- 2 fmt.Println(<-ch) fmt.Println(<-ch)
通过本章的学习,你应该已经掌握了 Go 语言的基础结构。这些基础知识将帮助你在后续的学习中更好地理解和应用 Go 语言。