初學go,確實go在網(wǎng)絡開發(fā)方面提供的很多便捷
- 自動化的編譯工具,一個go build搞定一切
- 豐富的標準庫郎嫁,幾乎所有的開源組件都支持go了
- 統(tǒng)一的編碼風格
雖然在語法上及一些編寫格式上還存在一些生疏,但感覺慢慢會喜歡上這個語言,雖然個人追求更底層术瓮,但是代碼工程就是如此,能復用別人的輪子就不要自己造贰健,這也是go和C++的一大區(qū)別吧胞四,C++有時太多需要自己造的輪子,標準化上確實比go差些伶椿。
第一次寫簡單的TCP通訊:
server.go 的代碼:
package main
import (
"config"
"fmt"
"net"
"time"
)
func handleConnection(conn net.Conn) {
var data []byte = make([]byte, 5, 10)
defer conn.Close()
conn.SetReadDeadline(time.Now().Add(time.Duration(10) * time.Second)) // 100ms
_, err := conn.Read(data)
if err != nil {
fmt.Println("read data failed, err=" + err.Error())
return
}
str := string(data)
fmt.Println("server recv:" + str)
sendData := []byte(conn.RemoteAddr().String())
conn.Write(sendData)
}
func main() {
fmt.Println("hellow")
config.LoadConfig()
ln, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("listen to 8080 error")
return
}
for {
conn, err := ln.Accept()
if err != nil {
fmt.Println("conn accept failed")
return
}
go handleConnection(conn)
}
}
一開始一直遇到Read函數(shù)返回EOF錯誤辜伟,后面查了些資料,才想起來切片需要make初始化脊另。
另外還需要明白导狡,切片初始化長度為5的話,那么最多接收5個字節(jié)偎痛,其他數(shù)據(jù)就循環(huán)接收這樣旱捧。
client.go 代碼
package main
import (
"fmt"
"io"
"net"
"strconv"
"time"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("dial failed")
}
data := []byte("hello i'm client")
n, errConn := conn.Write(data)
defer conn.Close()
if errConn != nil {
fmt.Println("write failed, err=" + errConn.Error())
return
}
fmt.Println("write succeed, count=" + strconv.Itoa(n))
conn.SetReadDeadline(time.Now().Add(time.Duration(10) * time.Second))
for {
recvData := make([]byte, 100, 1024)
_, err := conn.Read(recvData)
if err != nil {
if err == io.EOF {
break
}
fmt.Println("read failed, err=" + err.Error())
}
fmt.Println("read data:" + string(recvData))
}
fmt.Println("end request")
}
對go的面向?qū)ο蠛兔嫦蜻^程,有時總是感覺混亂踩麦,用多了可能就好了吧