Go 语言的学习大纲:
一、Go 语言基础
1.Go 语言的特点和优势
Go 语言是一门相对年轻的编程语言,它具有以下特点和优势:
- 并发编程能力:Go 语言天生支持并发编程,使用 goroutine 和 channel 可以轻松实现并发操作,让编程更加高效。
- 高效的内存管理:Go 语言使用垃圾回收机制进行内存管理,省去了手动管理内存的繁琐过程,并且相对于其他语言拥有更高的效率和更低的内存占用。
- 简洁的语法:Go 语言的语法简单明了,易于学习和理解,同时它也具备强大的表达能力和灵活性。
- 快速编译:Go 语言的编译速度快,可以实现秒级编译和运行,并且生成的可执行文件体积小,适用于云计算和分布式环境。
- 多平台支持:Go 语言可以编译成多个平台的可执行文件,例如 Windows、Linux、macOS 等等,适用于跨平台开发。
- 强大的标准库:Go 语言的标准库非常丰富,包括字符串处理、文件操作、网络编程、数据库操作、图像处理等等,可以满足各种日常开发需求。
- 安全性高:Go 语言的类型系统和内存管理机制可以有效地防止一些常见的安全漏洞,例如缓冲区溢出、空指针引用等等。
总的来说,Go 语言是一门具有高效性、并发性、简洁性、安全性、可移植性等多方面优势的编程语言,适用于各种云计算、分布式系统、网络编程和高性能应用的开发。
2.Go 语言的安装和配置
windows版:
下载 Go 安装包:可以在官方网站(https://golang.org/dl/)下载适合自己操作系统的 Go 版本安装包。例如在 Windows 上下载对应的 .msi 文件。
安装 Go :双击下载好的安装包,按照提示进行安装即可。在 Windows 上,可以选择自定义安装选项,将 Go 安装到指定目录,例如 C:\Go。
配置环境变量:在 Windows 上,可以通过以下步骤配置环境变量:
在桌面上右键点击“此电脑”,选择“属性”。
选择“高级系统设置”-“环境变量”。
在“系统变量”中找到“Path”变量,并点击“编辑”。
在编辑环境变量窗口中,点击“新建”按钮。
输入 Go 的安装目录的路径,例如 C:\Go\bin。
点击“确定”按钮保存设置,退出窗口。
设置 Go 工作目录:可以在任意目录下创建一个新文件夹,将其作为 Go 项目的工作目录。在命令行中执行 Go 命令时,会默认在工作目录中查找和执行 Go 代码。例如在 Windows 上,可以在 D 盘下创建一个名为 GoProjects 的文件夹作为工作目录。
配置编辑器:可以选择自己喜欢的 Go 语言编辑器或集成开发环境(IDE),例如 GoLand、VSCode、Sublime Text 等等。在编辑器中设置 Go 的工作目录和环境变量,以便于编写、运行和调试 Go 代码。
完成以上步骤后,就可以开始使用 Go 语言进行开发了。在命令行中执行 go version 命令,可以查看当前安装的 Go 版本号信息,以确保安装成功。
mac版
下载 Go 安装包:可以在官方网站(https://golang.org/dl/)下载适合自己操作系统的 Go 版本安装包。在 MacOS 上可以下载 .pkg 文件。
安装 Go :双击下载好的 .pkg 文件,按照提示进行安装即可。
配置环境变量:在 MacOS 上,需要将 Go 的安装目录添加到环境变量 PATH 中,可以编辑 ~/.bash_profile 文件,将以下代码添加到文件末尾:
export PATH=$PATH:/usr/local/go/bin
设置 Go 工作目录:在任意目录下创建一个新文件夹,将其作为 Go 项目的工作目录。例如在终端中执行以下命令:
mkdir ~/go
这会在用户目录下创建一个名为 go 的文件夹作为工作目录。
配置编辑器:可以选择自己喜欢的 Go 语言编辑器或集成开发环境(IDE),例如 GoLand、VSCode、Sublime Text 等等。在编辑器中设置 Go 的工作目录和环境变量,以便于编写、运行和调试 Go 代码。
完成以上步骤后,就可以在终端中执行 Go 命令进行开发了。在终端中执行 go version 命令,可以查看当前安装的 Go 版本号信息,以确保安装成功。
3.Go 语言的数据类型和变量
Go 语言的数据类型和变量如下:
基本数据类型:Go 语言提供了基本数据类型包括整型、浮点型、布尔型、字符串型和字符型,分别为 int、float、bool、string 和 byte。
复合数据类型:Go 语言提供了复合数据类型包括数组、切片、映射和结构体。数组是一组固定长度的数据,切片是一个能动态扩容的数组,映射是一组键值对,结构体是一组不同类型的数据字段组成的数据类型。
其他数据类型:Go 语言还提供了指针、函数、接口、通道等数据类型,这些数据类型在高级编程中非常有用。
变量:在 Go 语言中,使用 var 关键字定义变量,例如 var x int 表示定义一个整型变量 x。也可以使用 := 运算符进行自动类型推断,例如 x := 10 表示定义一个整型变量 x 并初始化为 10。变量的值可以在定义后随时修改。
在 Go 语言中,变量的类型必须在定义时确定,并且变量必须使用。如果定义了变量但没有使用,会导致编译错误。另外,Go 语言要求变量名必须以字母或下划线开头,可以包含数字和字母的组合。变量名的首字母大小写决定了变量的可见性,大写字母开头的变量可以被其他包访问,小写字母开头的变量只能在本包中访问。
4.Go 语言的运算符和表达式
Go 语言的运算符和表达式如下:
- 算术运算符:包括加减乘除、取模和自增自减运算符。例如 +、-、*、/、%、++、–。
- 关系运算符:包括等于、不等于、大于、小于、大于等于和小于等于运算符。例如 ==、!=、>、<、>=、<=。
- 逻辑运算符:包括逻辑与、逻辑或和逻辑非运算符。例如 &&、||、!。
- 位运算符:包括按位与、按位或、按位异或和位移运算符。例如 &、|、^、<<、>>。
- 赋值运算符:包括简单赋值、加减乘除取模自增自减等组合赋值运算符。例如 =、+=、-=、*=、/=、%=、++、–。
- 其他运算符:包括地址运算符、取值运算符、大小运算符、类型断言运算符等等。例如 &、*、sizeof、type assertion 等等。
在表达式中,可以使用运算符来组合和操作变量、常量、函数等值,以得到最终的结果。表达式的值可以是基本数据类型、复合数据类型、函数等等。表达式的运算顺序遵循运算符的优先级和结合性规则,可以使用括号来改变运算顺序。
5.Go 语言的控制结构(if、switch、for)
Go 语言的控制结构包括 if、switch 和 for 三种,具体如下:
a.if 结构:用于根据条件来判断是否执行某段代码。if 语句的基本形式是:
if condition {
// code to execute
}
如果条件 condition 为真,则执行花括号中的代码,否则跳过该代码块。if 语句还支持 else 子句和 else if 子句来实现条件嵌套。
b.switch 结构:用于根据不同的值来执行不同的代码块。switch 语句的基本形式是:
switch expression {
case value1:
// code to execute
case value2:
// code to execute
default:
// code to execute
}
根据 expression 的值来匹配不同的 case,如果匹配成功,则执行相应的代码块,否则执行 default 代码块。switch 语句还支持 fallthrough 关键字来实现 case 穿透。
c.for 结构:用于重复执行某段代码。for 语句的基本形式有三种:
// 循环条件
for i := 0; i < 10; i++ {
// code to execute
}
// 类似 while 循环
for condition {
// code to execute
}
// 无限循环
for {
// code to execute
}
第一种形式是最常用的,i 是循环计数器,i < 10 是循环条件,i++ 是计数器更新操作。第二种形式类似于 while 循环,只要条件为真就不停循环。第三种形式是无限循环,需要在代码块中使用 break 语句或条件语句来结束循环。
以上是 Go 语言的三种基本控制结构,它们组合使用可以实现复杂的逻辑控制和循环操作。
6.Go 语言的函数和方法
Go 语言的函数和方法如下:
函数:在 Go 语言中,使用关键字 func 定义函数。函数可以接受多个参数,并且可以返回一个或多个值。一个函数的基本形式如下:
func function_name(parameter_list) (return_type_list) {
// function body
}
其中,function_name 是函数名,parameter_list 是参数列表,return_type_list 是返回值类型列表,function body 是函数体。函数可以在程序中多次调用,以达到代码复用的目的。
方法:在 Go 语言中,方法是一种与特定类型相关联的函数。方法可以通过结构体和接口来定义。一个方法的基本形式如下:
func (receiver_type) method_name(parameter_list) (return_type_list) {
// method body
}
其中,receiver_type 是方法的接收者类型,method_name 是方法名,parameter_list 是参数列表,return_type_list 是返回值类型列表,method body 是方法体。方法可以通过点号 (.) 访问,例如 struct1.method1(),这里 struct1 是一个结构体实例。
在 Go 语言中,函数和方法都是一等公民,可以像其他变量一样进行传递、赋值、返回等操作。Go 语言还支持多返回值、不定参数、匿名函数等特性,可以提高编码效率和灵活性。
7.Go 语言的数组和切片
Go 语言的数组和切片如下:
数组:在 Go 语言中,数组是一组具有相同类型的固定长度的值的集合。定义数组的语法如下:
var arr [n]type
其中,n 表示数组的长度,type 表示数组元素的类型。例如,定义一个长度为 3,元素类型为 int 的数组:
var a [3]int
数组的元素可以通过下标访问,下标从 0 开始,例如 a[0]、a[1]、a[2]。
切片:在 Go 语言中,切片是一个动态大小的数组。切片的定义语法如下:
var slice []type
切片可以从一个数组或另一个切片中创建,也可以通过 make 函数创建。例如,创建一个长度为 3,容量为 5,元素类型为 int 的切片:
a := make([]int, 3, 5)
切片的长度是指切片中实际存储的元素个数,容量是指底层数组中可以存储的元素个数。切片的元素可以通过下标访问,切片还支持切片操作、追加操作、复制操作等常用操作。
在 Go 语言中,数组和切片都是重要的数据类型,它们广泛应用于各种场景,例如数据结构、算法、网络编程、并发编程等。使用数组和切片可以提高程序的效率和可读性。
8.Go 语言的结构体和指针
Go 语言的结构体和指针如下:
结构体:在 Go 语言中,结构体是一种自定义的数据类型,可以由任意数量和类型的数据字段组成。结构体的定义语法如下:
type struct_name struct {
field1 type1
field2 type2
...
}
其中,struct_name 是结构体名,field1、field2 等是结构体的数据字段,type1、type2 等是数据字段的类型。例如,定义一个名为 Person 的结构体:
type Person struct {
name string
age int
}
结构体的数据字段可以通过点号 (.) 访问,例如 person1.name、person1.age,这里 person1 是一个 Person 类型的结构体实例。
指针:在 Go 语言中,指针是一种变量,它存储了另一个变量的内存地址。使用 & 运算符可以取得一个变量的地址,使用 * 运算符可以访问指向该地址的变量。例如,定义一个指向 int 类型变量 x 的指针:
var pointer *int
pointer = &x
在 Go 语言中,结构体的指针可以通过 new 函数创建,例如:
var person1 *Person
person1 = new(Person)
这里 person1 是一个 Person 类型的指针,可以通过箭头 (->) 访问结构体的数据字段,例如 person1->name、person1->age。
在 Go 语言中,结构体和指针都是重要的数据类型,它们广泛应用于各种场景,例如面向对象编程、网络编程、并发编程等。使用结构体和指针可以提高程序的效率和可读性。
9.Go 语言的接口和类型断言
Go 语言的接口和类型断言如下:
接口:在 Go 语言中,接口是一种抽象的类型,它定义了一组方法的集合。接口的定义语法如下:
type interface_name interface {
method1(parameter_list) return_type_list
method2(parameter_list) return_type_list
...
}
其中,interface_name 是接口名,method1、method2 等是接口的方法,parameter_list 是参数列表,return_type_list 是返回值类型列表。例如,定义一个名为 Animal 的接口:
type Animal interface {
Eat()
Sleep()
}
接口的实现是隐式的,只要一个类型实现了接口中的所有方法,就可以将该类型的实例赋值给接口变量,例如:
type Cat struct {
}
func (c Cat) Eat() {
fmt.Println("Cat is eating.")
}
func (c Cat) Sleep() {
fmt.Println("Cat is sleeping.")
}
func main() {
var animal Animal
animal = Cat{
}
animal.Eat()
animal.Sleep()
}
这里 Cat 类型实现了 Animal 接口的 Eat 和 Sleep 方法,可以将 Cat 的实例赋值给 Animal 类型的变量 animal。
类型断言:在 Go 语言中,类型断言是一种将接口类型转换为其他类型的操作。类型断言的语法如下:
value, ok := interface_value.(type)
其中,interface_value 是接口变量,value 是转换后的值,ok 是一个布尔值表示转换是否成功。例如,在上面的示例中,可以使用类型断言将 Animal 类型的变量转换为 Cat 类型的变量:
func main() {
var animal Animal
animal = Cat{
}
cat, ok := animal.(Cat)
if ok {
cat.Eat()
cat.Sleep()
}
}
这里 animal 是 Animal 类型的变量,使用类型断言将它转换为 Cat 类型的变量 cat,然后调用 cat 的 Eat 和 Sleep 方法。
在 Go 语言中,接口和类型断言是重要的特性,它们提供了一种抽象和灵活的编程方式,可以方便地实现面向对象编程、多态和类型转换等功能。
10.Go 语言的错误处理(panic 和 recover)
Go 语言的错误处理包括 panic 和 recover 两种机制,具体如下:
panic:在 Go 语言中,panic 是一种运行时错误,它表示程序无法继续正常执行。使用 panic 函数可以引发一个 panic,例如:
func main() {
panic("Error occurred.")
}
这里调用了 panic 函数,程序会立即终止,并打印错误信息 “Error occurred.”。
recover:在 Go 语言中,recover 是一种可以捕获 panic 错误的机制。使用 recover 函数可以在程序发生 panic 错误时,恢复程序的执行,并进行错误处理。例如:
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Error occurred:", r)
}
}()
panic("Something went wrong.")
fmt.Println("This line will not be executed.")
}
这里使用 defer 关键字和匿名函数来捕获 panic 错误并进行处理。当程序发生 panic 错误时,匿名函数会被调用,并使用 recover 函数来获取错误信息,最终输出 “Error occurred: Something went wrong.”。
在 Go 语言中,panic 和 recover 机制可以用于处理程序中的异常情况,例如文件读写错误、网络连接错误等。使用 panic 函数可以引发一个 panic,使用 recover 函数可以在程序发生 panic 错误时,恢复程序的执行,并进行错误处理。注意,在正常情况下,不应该滥用 panic 和 recover,而应该通过错误返回来进行错误处理。
二、Go 语言的标准库
1.fmt 包:格式化输入输出
Go 语言中 fmt 包提供了格式化输入输出的功能。fmt 包中包含了多种输出格式,可以格式化输出变量、字符串、数字等。常用的函数有:
Printf:格式化输出字符串,语法和 C 语言的 printf 函数类似,支持占位符 %s、%d、%f、%v 等。
package main
import "fmt"
func main() {
name := "John"
age := 26
height := 1.8
fmt.Printf("Name: %s, age: %d, height: %.2f\n", name, age, height)
}
输出结果:
Name: John, age: 26, height: 1.80
Sprintf:格式化输出字符串,并将结果保存到一个字符串变量中。
package main
import "fmt"
func main() {
name := "John"
age := 26
height := 1.8
str := fmt.Sprintf("Name: %s, age: %d, height: %.2f\n", name, age, height)
fmt.Println(str)
}
输出结果:
Name: John, age: 26, height: 1.80
Fprintf:将格式化的字符串输出到文件中。
package main
import (
"fmt"
"os"
)
func main() {
name := "John"
age := 26
height := 1.8
file, _ := os.Create("output.txt")
defer file.Close()
fmt.Fprintf(file, "Name: %s, age: %d, height: %.2f\n", name, age, height)
}
将格式化的字符串输出到文件 output.txt 中。
除了上述三个函数,fmt 包中还包含了其他的函数,例如 Scanf、Sscan 和 Fscan 等,可以实现格式化输入功能。使用 fmt 包可以方便地进行字符串的格式化输入输出,提高程序的可读性和可维护性。
Scanf:从标准输入中读取数据,格式化输入。
package main
import "fmt"
func main() {
var name string
var age int
fmt.Println("Please enter your name and age:")
fmt.Scanf("%s %d", &name, &age)
fmt.Printf("Hello, %s! You are %d years old.\n", name, age)
}
运行结果:
Please enter your name and age:
John 26
Hello, John! You are 26 years old.
Sscan:从字符串中读取数据,格式化输入。
package main
import "fmt"
func main() {
var name string
var age int
str := "John 26"
fmt.Sscanf(str, "%s %d", &name, &age)
fmt.Printf("Hello, %s! You are %d years old.\n", name, age)
}
运行结果:
Hello, John! You are 26 years old.
Fscan:从文件中读取数据,格式化输入。
package main
import (
"fmt"
"os"
)
func main() {
var name string
var age int
file, _ := os.Open("input.txt")
defer file.Close()
fmt.Fscanf(file, "%s %d", &name, &age)
fmt.Printf("Hello, %s! You are %d years old.\n", name, age)
}
文件 input.txt 的内容为:
John 26
运行结果:
Hello, John! You are 26 years old.
使用 Scanf、Sscan 和 Fscan 等输入函数,可以方便地从标准输入、字符串或文件中读取数据,并进行格式化输入。
2.os 包:文件操作和环境变量
在 Go 语言中,os 包提供了文件操作和环境变量等功能。常用的函数有:
Create:创建文件,返回一个文件对象。
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Create("output.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
file.WriteString("Hello, World!")
}
创建一个名为 output.txt 的文件,并向文件中写入一行字符串。
Open:打开文件,返回一个文件对象。
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Open("input.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
data := make([]byte, 1024)
count, err := file.Read(data)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Read %d bytes: %s\n", count, data[:count])
}
打开一个名为 input.txt 的文件,并读取文件中的内容。
Mkdir 和 MkdirAll:创建目录。
package main
import (
"fmt"
"os"
)
func main() {
err := os.Mkdir("testdir", 0755)
if err != nil {
fmt.Println(err)
return
}
defer os.Remove("testdir")
// MkdirAll 可以创建多级目录
err = os.MkdirAll("testdir/subdir", 0755)
if err != nil {
fmt.Println(err)
return
}
defer os.RemoveAll("testdir")
}
创建一个名为 testdir 的目录,并创建 testdir/subdir 子目录。
Getenv 和 Setenv:读取和设置环境变量。
package main
import (
"fmt"
"os"
)
func main() {
os.Setenv("MYVAR", "Hello, World!")
fmt.Println("MYVAR:", os.Getenv("MYVAR"))
}
设置环境变量 MYVAR 的值为 “Hello, World!”,并读取 MYVAR 的值。
os 包提供了文件操作和环境变量等功能,可以方便地进行文件读写、目录操作和环境变量读写等操作。
3.io 包:输入输出操作
在 Go 语言中,io 包提供了输入输出操作的功能,其中包括了 Reader 和 Writer 接口,以及各种实现了这些接口的类型和函数。常用的函数有:
io.Copy:复制数据,将一个 Reader 中的数据复制到一个 Writer 中。
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, _ := os.Open("input.txt")
defer file.Close()
out, _ := os.Create("output.txt")
defer out.Close()
count, _ := io.Copy(out, file)
fmt.Printf("Copied %d bytes.\n", count)
}
从文件 input.txt 中读取数据,并将数据复制到文件 output.txt 中。
io.ReadAll:读取所有数据,读取一个 Reader 中的所有数据。
package main
import (
"fmt"
"io/ioutil"
)
func main() {
data, _ := ioutil.ReadFile("input.txt")
fmt.Printf("Read %d bytes: %s\n", len(data), data)
}
从文件 input.txt 中读取所有数据,并将数据输出到终端上。
io.WriteString:写入数据,向一个 Writer 中写入字符串。
package main
import (
"fmt"
"io"
"os"
)
func main() {
out, _ := os.Create("output.txt")
defer out.Close()
count, _ := io.WriteString(out, "Hello, World!")
fmt.Printf("Wrote %d bytes.\n", count)
}
向文件 output.txt 中写入一行字符串 “Hello, World!”。
io 包提供了丰富的输入输出操作函数和接口,可以方便地读写数据,提高程序的可靠性和效率。
4.net 包:网络编程
在 Go 语言中,net 包提供了网络编程的功能。其中包括了 TCP、UDP、HTTP、WebSocket、RPC 等协议的支持,以及对 IP、ICMP、DNS、TLS 等协议的支持。常用的函数有:
net.Dial:创建 TCP 或 UDP 连接,返回一个 Conn 对象。
package main
import (
"fmt"
"net"
)
func main() {
conn, _ := net.Dial("tcp", "golang.org:80")
defer conn.Close()
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
data := make([]byte, 1024)
count, _ := conn.Read(data)
fmt.Printf("Received %d bytes: %s\n", count, data[:count])
}
创建一个 TCP 连接,连接到 golang.org 的 80 端口,并向服务器发送 HTTP 请求。文章来源:https://www.toymoban.com/news/detail-552139.html
net.Listen:创建 TCP 或 UDP 服务器,返回一个 Listener 对象。文章来源地址https://www.toymoban.com/news/detail-552139.html
package main
import (
"fmt"
"net"
)
func handle(conn net.Conn)
到了这里,关于从零开始学习go开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!