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的并发通信网络进行了底层优化,降低了服务开销。我们之后会进一步的讨论这些。