第二天知识总结| 青训营

85 阅读3分钟

今天对第二天重点知识进行总结。

GO语言中的goroutine是一种轻量级的执行单元,类似于线程,但由Go语言的运行时系统管理。Goroutine可以通过关键字go启动,无需显式创建线程,因此具有很低的开销。多个goroutine可以并发执行,充分利用多核处理器。

Channel是goroutine之间进行通信的主要机制。它是一种类型安全的、阻塞的数据结构,用于在goroutine之间传递数据。通过channel,一个goroutine可以将数据发送到channel,而另一个goroutine可以从channel接收这些数据。这种通信方式使得goroutine之间可以同步执行或进行数据交换,避免了显式的锁机制,简化了并发编程。

示例:


go  
Copy code  
func worker(id int, jobs <-chan int, results chan<- int) {  
    for job := range jobs {  
        // 执行任务并将结果发送到results channel  
        results <- job * 2  
    }  
}  
  
func main() {  
    numJobs := 5  
    jobs := make(chan int, numJobs)  
    results := make(chan int, numJobs)  
  
    // 启动多个goroutine并发执行任务  
    for i := 1; i <= 3; i++ {  
        go worker(i, jobs, results)  
    }  

  
    // 发送任务到jobs channel  
    for i := 1; i <= numJobs; i++ {  
        jobs <- i  
    }  
    close(jobs)  
  
    // 从results channel接收结果  
    for i := 1; i <= numJobs; i++ {  
        result := <-results  
        fmt.Println(result)  
    }  
}  

sync包提供了同步原语,用于协调不同goroutine之间的执行。常用的同步原语有WaitGroup、Mutex和Cond等。WaitGroup用于等待一组goroutine完成执行,Mutex用于保护共享资源,Cond用于在goroutine之间进行条件变量的同步。
sync.Mutex:互斥锁,用于保护共享资源,防止多个 goroutine 同时访问和修改。
sync.RWMutex:读写锁,允许多个 goroutine 并发读取共享资源,但只能有一个 goroutine 写入共享资源。
sync.WaitGroup:等待组,用于等待一组 goroutine 完成执行,主要用于并发任务的同步等待。
sync.Once:一次性执行,用于确保一个函数只执行一次,常用于单例模式的实现。

示例:

import (  
    "fmt"  
    "sync"  
)  
  
func main() {  
    var wg sync.WaitGroup  
    var mu sync.Mutex  
    var count int  
  
    numWorkers := 3  
  
    // 模拟并发递增count  
    for i := 0; i < numWorkers; i++ {  
        wg.Add(1)  
        go func() {  
            mu.Lock()  
            count++  
            mu.Unlock()  
            wg.Done()  
        }()  
    }  

    // 等待所有goroutine完成  
    wg.Wait()  
  
    fmt.Println("Final count:", count)  
}  

通过合理地使用goroutine、channel和sync,GO语言可以实现高效、简洁的并发编程,处理并发任务变得更加容易和安全。

要实现代理连接功能,可以使用GO语言标准库中的“net/http”包来实现代理功能。 net/http 是GO语言标准库中的一个包,用于创建和处理HTTP请求和响应。它提供了创建HTTP服务器和客户端的功能,以便在GO语言中进行Web开发和网络通信。

net/http 包主要包含以下几个关键组件:

HTTP服务器:

http.HandleFunc:用于将HTTP请求路由到处理函数。
http.Handle:用于将HTTP请求路由到实现了http.Handler接口的处理器。
http.ListenAndServe:用于启动HTTP服务器并开始监听指定端口。
HTTP客户端:

http.Get:用于发送GET请求并返回响应。
http.Post:用于发送POST请求并返回响应。
http.Do:用于发送自定义的HTTP请求并返回响应。
http.Request 和 http.Response:表示HTTP请求和响应的结构体,包含请求头、请求体和响应头等信息。