Go 语言入门指南 | 青训营笔记

37 阅读2分钟

golang是c++程序员创造的语言,在c++这一高级语言的设计思想上,通过编译原理的思想和erlang风格的通道机制,添加了gc机制,同时也秉承了c语言简单而强大的特性,在设计时被定义为网络编程中的c++的替代语言。现在已经受到了国内外的广泛关注和重视,普及。golang在github上有110k+star,相比openjdk的3k+star远远超过。但是目前go语言的使用和工业实践仍然是属于比较小众的。但就个人来看很相信golang能够不断发展。

golang的一个重要的机制就是消息传递机制,进程之间可以通过make chann关键字进行进程间消息传递,并且在语言层面上支持并发,对于服务端的部署比较友好。

但可以看到的是,在实际落地实践中,golang仍然是比较重耗资源的语言实现,相对c++的编译型程序仍然有着不小的性能差距。

然而,这些对于我这种码畜是接触不到的层面,现在是为了重新温故一下golang的设计思路和初步入门,为直接实践,我们从网络编程开始:

package main

import(
    "fmt"
    "net"
)

func handleRequest(conn net.Conn) {
    buffer:=make([]byte, 1024)
    r, err := conn.Read(buffer)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
        return
    }
    messsage := string(buffer[:n])
    fmt.Println("Receivec message:", message)
    conn.Write([]byte("Message receivec"))
    conn.Close()
}

func main() {
    listener, err := net.Listen("tcp", "localhost:8000")
    if err != nil {
        fmt.Println("Error setting up listener:", err.Error())
        return
    }
    fmt.Println("Listening on localhost:8000")
    
    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err.Error())
            continue
        }
        go handleRequest(conn)
    }
}

以上代码是十分常见的一个网络请求的过程。在go语言中,使用go mod进行包管理机制,每个文件都有着严格的包名和fmt编码规范强制,同时相同目录下不能有相同的包名。

代码中开辟了一个1024字节的缓冲区,并进行缓冲区的消息监听,在8000端口进行tcp监听,并使用go关键字进行并行网络监听。

要注意的是,go关键字对于每个进程都会开辟一个go routine,这对于资源消耗是比较巨大的,因此,在开源的hertz等框架中,都对go的并发通信网络进行了底层优化,降低了服务开销。我们之后会进一步的讨论这些。