1. JSON 数据处理JSON 是一种轻量级的数据交换格式,Go 提供了 encoding/json 包来处理 JSON 数据的解析和编码。
1.1 JSON 解码以下代码展示了如何将 JSON 字符串解码为 Go 结构体。
12345678910111213141516171819202122package mainimport ( "encoding/json" "fmt")type Person struct { Name string `json:"name"` Age int `json:"age"`}func main() { jsonData := `{"name": "Alice", "age": 25}` var person Person err := json.Unmarshal([]byte(jsonData), & ...
1. TCP 连接在 Go 中,net 包提供了用于 TCP 连接的工具,可以创建客户端和服务器来实现数据的双向传输。
TCP 客户端示例下面的代码展示了如何通过 TCP 客户端连接到服务器,并发送和接收数据。
1234567891011121314151617181920package mainimport ( "fmt" "net")func main() { conn, err := net.Dial("tcp", "localhost:8080") if err != nil { fmt.Println("连接服务器失败:", err) return } defer conn.Close() conn.Write([]byte("Hello, Server!")) buf := make([]byte, 1024) n, _ := conn.Read ...
1. 创建目录Go 语言中可以使用 os.Mkdir 和 os.MkdirAll 方法来创建文件夹。
os.Mkdir 用于创建单层目录。如果目录已存在或路径无效,会返回错误。
os.MkdirAll 用于创建多层目录,它会自动创建不存在的父级目录。
示例代码:创建目录12345678910111213141516171819202122package mainimport ( "fmt" "os")func main() { err := os.Mkdir("exampleDir", 0755) if err != nil { fmt.Println("创建目录失败:", err) return } fmt.Println("目录创建成功") err = os.MkdirAll("parentDir/childDir", 0755) if err != ni ...
服务端
未读1. os 包中的文件操作1.1 创建文件在 Go 语言中,我们可以使用 os.Create 函数来创建文件。该函数会返回一个 *os.File 指针,我们可以通过它进行后续的文件操作。
12345678910111213141516package mainimport ( "fmt" "os")func main() { file, err := os.Create("example.txt") if err != nil { fmt.Println("文件创建失败:", err) return } defer file.Close() fmt.Println("文件创建成功")}
1.2 打开文件使用 os.Open 可以打开一个已存在的文件,该函数返回一个只读文件指针;如果文件不存在,会返回错误。
123456file, err := os.Open("exam ...
1. defer 的定义与应用场景defer 语句用于延迟函数的执行,直到封闭函数返回时才执行。常用于资源清理、文件关闭、解锁互斥锁等需要在函数结束时执行的操作。
示例代码123456789package mainimport "fmt"func main() { fmt.Println("Start") defer fmt.Println("Deferred execution") fmt.Println("End")}
执行顺序:Start -> End -> Deferred execution
应用场景
文件操作:在函数退出时自动关闭文件。
锁的释放:确保互斥锁解锁。
数据库连接:在连接完成后,确保自动断开连接。
12345file, err := os.Open("file.txt")if err != nil { log.Fatal(err)}defer file.Close()
2. pan ...
1. 自定义错误的定义在 Go 中,可以通过定义实现了 error 接口的结构体来创建自定义错误。自定义错误可以添加更多的上下文信息,例如错误代码、错误级别等。
示例代码12345678910111213141516171819package mainimport ( "fmt")type MyError struct { Code int Message string}func (e *MyError) Error() string { return fmt.Sprintf("Error %d: %s", e.Code, e.Message)}func main() { err := &MyError{Code: 400, Message: "Bad Request"} fmt.Println(err)}
在此示例中,我们通过 Code 字段提供额外的错误代码信息,帮助定位和理解错误的根本原因。 ...
1. error 接口的定义在 Go 中,错误通过 error 接口表示,该接口只包含一个方法 Error(),返回错误的描述信息。
123type error interface { Error() string}
任何实现了 Error 方法的类型都被视为 error 类型,允许返回详细的错误信息。
2. errors 包的基本用法Go 提供了 errors 包来帮助我们创建简单的错误,errors.New 是创建错误的最基本方式。
示例代码1234567891011package mainimport ( "errors" "fmt")func main() { err := errors.New("an error occurred") fmt.Println(err)}
3. 自定义错误在实际开发中,我们通常需要创建自定义错误类型来提供更多上下文信息。自定义错误类型可以通过实现 error 接口来实现。
示例代码12345678910111 ...
1. WaitGroup 的基本用法WaitGroup 是 Go 中用于等待一组 Goroutine 完成的同步工具。使用 Add 方法设置等待的 Goroutine 数量,Done 方法在Goroutine 完成时调用,Wait 方法会阻塞直到所有 Goroutine 执行完成。
示例代码1234567891011121314151617181920212223242526package mainimport ( "fmt" "sync" "time")func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d starting", id) time.Sleep(time.Second) fmt.Printf("Worker %d done", id)}func main() { var wg sync.Wai ...
1. 什么是 select 语句select 语句是 Go 中用于 Channel 上多路复用的控制结构。它可以同时监听多个 Channel 的发送和接收操作,当其中一个 Channel准备好后便会执行相应的语句。
这种机制类似于网络编程中的 I/O 多路复用,可以高效地处理并发任务。
2. select 语句的基本用法select 语句的语法结构如下:
12345678select {case value := <-ch1: // ch1 准备好后的处理逻辑case ch2 <- value: // 向 ch2 发送数据后的处理逻辑default: // 当没有 Channel 准备好时执行的逻辑}
在上述结构中,select 会等待任意一个 case 准备就绪,然后执行该 case 对应的操作。
示例12345678910111213141516171819202122232425262728package mainimport ( "fmt" "time")func ...
1. 什么是 Channel在 Go 中,Channel 是一个用于 Goroutine 之间通信的管道,通常用于实现 Goroutine 之间的数据同步和消息传递。每一个 Channel都有一个特定的数据类型,数据在 Channel 中传递时需要匹配该类型。
可以通过 make 函数来创建一个 Channel:
1ch := make(chan int) // 创建一个用于传输 int 类型数据的 Channel
2. Channel 的基本用法发送和接收数据Channel 使用 <- 运算符进行数据传递。
ch <- value:向 Channel 发送数据。
value := <-ch:从 Channel 接收数据。
12345678910111213package mainimport "fmt"func main() { ch := make(chan int) go func() { ch <- 42 // 发送数据到 Channel }() value ...