结构体
定义结构体
type Person struct {
Name string
Age int
}
结构体方法
func (p Person) SayHello() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}
func (p *Person) ChangeName(newName string) {
p.Name = newName
}
错误处理
Go 语言通过返回错误值来处理错误:
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
JSON 处理
序列化
将结构体序列化为 JSON 字符串:
person := Person{Name: "Alice", Age: 30}
jsonBytes, err := json.Marshal(person)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println(string(jsonBytes))
}
反序列化
将 JSON 字符串反序列化为结构体:
jsonStr := `{"Name": "Bob", "Age": 25}`
var person Person
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println(person)
}
类型转换
f, _ := strconv.ParseInt("123", 10, 64)
fmt.Println(f) // 输出 123
示例程序
1. 基本示例
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
2. 使用第三方 API 发送请求
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type Response struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
url := "https://api.example.com/data"
resp, err := http.Get(url)
if err != nil {
fmt.Println("Error:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error:", err)
return
}
var response Response
err = json.Unmarshal(body, &response)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Name: %s, Age: %d\n", response.Name, response.Age)
}
3. SOCKS5 代理服务器
package main
import (
"fmt"
"net"
)
func handleConnection(conn net.Conn) {
defer conn.Close()
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Read error:", err)
return
}
// 解析请求
request := buf[:n]
// 处理请求
// ...
// 发送响应
response := []byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
_, err = conn.Write(response)
if err != nil {
fmt.Println("Write error:", err)
return
}
}
func main() {
listener, err := net.Listen("tcp", ":1080")
if err != nil {
fmt.Println("Listen error:", err)
return
}
defer listener.Close()
fmt.Println("SOCKS5 proxy server listening on :1080")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Accept error:", err)
continue
}
go handleConnection(conn)
}
}
运行程序
在命令行中运行 Go 程序,并传递参数:
go run main.go 参数1 参数2
应用领域
1. 网络编程
Go 语言在构建高性能的网络服务方面表现出色,广泛应用于 Web 服务器、API 服务和下载应用。例如,Docker 和 Kubernetes 等知名项目都是用 Go 语言开发的。
2. 分布式系统
Go 语言的并发模型和简洁性使得开发者能够快速构建高性能、高可用的分布式系统。例如,etcd 和 Consul 等分布式键值存储系统都是用 Go 语言开发的。
3. 云平台
Go 语言在云计算领域的应用非常广泛,许多云服务提供商使用 Go 语言开发基础设施和服务。例如,阿里云、华为云等都大量使用 Go 语言。
4. 微服务
Go 语言非常适合构建微服务架构,许多微服务框架如 Gin、Beego 和 Echo 都是用 Go 语言开发的。这些框架提供了高性能、低延迟的微服务解决方案。
5. 数据处理
Go 语言在数据处理和日志处理方面也非常有用,可以高效地处理大量数据。例如,Logstash 和 Prometheus 等监控和日志处理工具都是用 Go 语言开发的。
优势与挑战
优势
- 简洁的语法:Go 语言的语法设计简洁,易于学习和使用。
- 高效的并发支持:goroutines 和 channels 使得并发编程变得简单。
- 自动的内存管理:垃圾回收机制减轻了开发者的负担。
- 强大的标准库:丰富的标准库涵盖了多个领域,方便快速开发。
- 快速的编译时间:编译速度快,提高了开发效率。
- 出色的性能:Go 语言的性能接近 C 和 C++,适合高性能应用。