美文网首页
记一次go尝试经历

记一次go尝试经历

作者: hijiang | 来源:发表于2019-05-22 01:00 被阅读0次

初学go,确实go在网络开发方面提供的很多便捷

  • 自动化的编译工具,一个go build搞定一切
  • 丰富的标准库,几乎所有的开源组件都支持go了
  • 统一的编码风格
    虽然在语法上及一些编写格式上还存在一些生疏,但感觉慢慢会喜欢上这个语言,虽然个人追求更底层,但是代码工程就是如此,能复用别人的轮子就不要自己造,这也是go和C++的一大区别吧,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函数返回EOF错误,后面查了些资料,才想起来切片需要make初始化。
另外还需要明白,切片初始化长度为5的话,那么最多接收5个字节,其他数据就循环接收这样。

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的面向对象和面向过程,有时总是感觉混乱,用多了可能就好了吧

相关文章

  • 记一次go尝试经历

    初学go,确实go在网络开发方面提供的很多便捷 自动化的编译工具,一个go build搞定一切 丰富的标准库,几乎...

  • 记一次 Google 面试经历

    记一次 Google 面试经历 记一次 Google 面试经历

  • 记一次go的入坑经历

    每个坑都是成长的一小步,初学go,于是想把srs用go重写下,练练手;完成信令部分后,美滋滋以为可以接着下一步处理...

  • 不过人傻钱多

    记一次伴娘经历

  • go modules详解

    go modules详解 [TOC] go1.11开始,支持使用go modules管理依赖包. 刚加入的适合尝试...

  • 【试译】《Do not Go Gentle into that

    第一次尝试一下英翻中…… Do not go gentle into that good night 不要温和地走...

  • 你还记得多少的第一次

    你还记得多少,记得你曾经的青葱稚嫩,你还记多少你的第一次尝试的胆怯,第一次尝试的艰难,第一次尝试的喜悦,尝试成功的...

  • 凤凰游记

    记一次凤凰古城的经历

  • java之后 对go的学习

    java目前工作的语言 鉴于python, go 的趋势 区块链中 go 学习go语言,尝试不同的风格,以及实际的...

  • 记一次runtime尝试

    尝试:runtime取到类方法,遍历调用类方法,结论:如果方法参数没有问题的话,是可以的。由于后期改变,最后参数没...

网友评论

      本文标题:记一次go尝试经历

      本文链接:https://www.haomeiwen.com/subject/rjyezqtx.html