Go语言(也称为Golang)是一种由Google开发的编程语言,以其简洁、高效和并发支持而闻名。从本文开始,将带你快速完成Go语言的学习,如果你之前有过Java或者C语言的基础,学习它将很容易,本教程忽略环境搭建步骤,直奔主题。
1. 程序结构
- 包声明:每个Go程序都从
package
声明开始,通常是package main
。 - 导入包:使用
import
关键字导入其他包。 - 函数:使用
func
关键字定义函数。 - 主函数:程序的入口点是
func main()
。
package main
import "fmt"
func main() {fmt.Println("Hello, World!")
}
2. 变量和常量
- 变量声明:使用
var
关键字声明变量,可以指定类型或使用类型推断。 - 短变量声明:在函数内部可以使用
:=
进行短变量声明。 - 常量:使用
const
关键字声明常量。
var a int = 10
b := 20
const c = 30
3. 数据类型
- 基本类型:整数
int
, 浮点float64
, 布尔bool
, 字符串string
- 复合类型:数组
array
, 切片slice
, 键值对映射表map
, 结构体struct
, 接口interface
- 注意:类型都是写在变量名后面,这和很多其他强类型语言不同
var i int = 10
var f float64 = 3.14
var s string = "Hello"
var b bool = true
4. 控制结构
- 条件语句:
if
,else if
,else
。 - 循环语句:
for
循环(Go中没有while
循环)。 - 选择语句:
switch
。
if a > b {fmt.Println("a更大")
} else if a < b {fmt.Println("b更大")
} else {fmt.Println("a和b相等")
}for i := 0; i < 5; i++ {fmt.Println(i)
}switch day {
case 1:fmt.Println("今天是星期一")
default:fmt.Println("今天不是星期一")
}
5. 函数
- 函数定义:使用
func
关键字定义函数,可以有多个参数和返回值。 - 多返回值:Go支持函数返回多个值,要
划重点
。 - 匿名函数:可以定义匿名函数并赋值给变量。
func add(x int, y int) int {return x + y
}func swap(x, y string) (string, string) {return y, x
}add := func(x, y int) int {return x + y
}
6. 错误处理
- 错误类型:Go使用
error
类型来处理错误。 - 错误返回:函数可以返回
error
作为最后一个返回值。
func divide(a, b int) (int, error) {if b == 0 {return 0, fmt.Errorf("除数不能为0")}return a / b, nil
}
7. 并发
- 协程 Goroutine [ɡəʊruːˈtiːn]:使用
go
关键字启动一个并发执行的函数,相当于轻量级线程。 - Channel:使用
chan
关键字创建通道,用于在Goroutine之间传递数据。
go func() {fmt.Println("这是并发运行的")
}()ch := make(chan int)
go func() {ch <- 42
}()
value := <-ch
8. 包和模块
- 包:Go程序由包组成,包可以包含多个文件。
- 模块:使用
go mod
管理依赖和版本。
import "fmt"
import "math"
9. 指针
- 指针类型:使用
*
表示指针类型,使用&
获取变量的地址。
var p *int
i := 42
p = &i
fmt.Println(*p) // 输出42
10. 结构体和方法
- 结构体:使用
type
和struct
关键字定义结构体。 - 方法:可以为结构体定义方法。
- 注意:和Java、C#的编写习惯不同,一个结构体的方法并不会把代码写在结构体的定义代码段上,而是类似于挂载的方式挂到结构体上。
type Person struct {Name stringAge int
}func (p Person) SayHello() {fmt.Printf("你好,我的名字是 %s\n", p.Name)
}
11. 接口
- 接口定义:使用
interface
关键字定义接口。 - 接口实现:类型通过实现接口的方法来满足接口,并非像Java和C#那样显式的声明结构体与接口的依赖关系,所以和上一段的写法没什么本质的区别。
type Speaker interface {Speak() string
}type Dog struct {Name string
}func (d Dog) Speak() string {return "旺!"
}
12. 错误处理
- 错误类型:Go使用
error
类型来处理错误。 - 错误返回:函数可以返回
error
作为最后一个返回值。
func divide(a, b int) (int, error) {if b == 0 {return 0, fmt.Errorf("除数不能为0")}return a / b, nil
}
13. 标准库
- fmt:格式化输入输出。
- math:数学函数。
- os:操作系统交互。
- net/http:HTTP客户端和服务器。
fmt.Println("Hello, World!")
14. 注释
- 单行注释:使用
//
。 - 多行注释:使用
/* ... */
。
// 这是一个单行注释/*
这是一个
多行注释
*/