go语言入门2 | 豆包MarsCode AI刷题

38 阅读3分钟

结构体

定义结构体
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 语言开发的。

优势与挑战

优势

  1. 简洁的语法:Go 语言的语法设计简洁,易于学习和使用。
  2. 高效的并发支持:goroutines 和 channels 使得并发编程变得简单。
  3. 自动的内存管理:垃圾回收机制减轻了开发者的负担。
  4. 强大的标准库:丰富的标准库涵盖了多个领域,方便快速开发。
  5. 快速的编译时间:编译速度快,提高了开发效率。
  6. 出色的性能:Go 语言的性能接近 C 和 C++,适合高性能应用。