zoukankan      html  css  js  c++  java
  • 在学Go语言

    首发:个人博客,更新&纠错&回复

    开始学点儿Go语言,这语言据说在国内比在国外火,社区上褒贬不一,不过“小马过河”嘛,总要先自己试试再来下结论。

    环境准备:

    1.在Golang中国下载安装go语言,个人喜欢用msi安装,直接帮你设置环境变量,免得手动弄。
    2.安装goclipse:在eclipse官网下载最新版eclipse,安装后进入菜单Help -> Install New Software,输入网址http://goclipse.github.io/releases/。注意在读出的长长的列表中选择goclipse即可,千万别全选(血的教训),然后一路Next。
    3.安装好goclipse后,在eclipse配置(Window -> Preferences)中选Go菜单,里面的GOROOTGOPATH自行指定,前者当然就是go的根目录,后者自行指定一个目录。
    4.如果在控制台无法运行git命令,即电脑中未安装git客户端,则需要下载msysgit并安装,这是为第5步做准备。
    5.点开菜单Go-Tools,点Download gocode的大按钮,会自动下载安装gocode,并放到上一步你指定的GOPATH里。
    6.下载GDB(我图省事直接在csdn下的),将exe文件放到系统path中,即让命令行运行gdb能够生效(我是将它直接放到go文件夹下的bin里了),这样goclipse就能断点调试了。

    学习体会:
    这里有go语言的中文文档,入门读七牛出的《Go语言编程》个人觉得不错,该书附录有“常用包介绍”,对照着去文档看看挺好。

    语法上,一般评价是“乏善可陈”,不花哨,走实用主义路线,看书第1章提到的,自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数闭包,类型接口,并发编程,反射,都比较基本,还有些动态语言常见的讨喜的语法糖,除了多返回值之外,出彩的地方不多,但Go是强类型的。

    这意味着编译器能帮你做很多事,错误检查,语法提示,这能减轻程序员的不少负担,编译的结果比如exe程序,直接放到服务器裸机上就能跑,不像python啊nodejs它们需要现在目标机器上安语言,减轻了点工作量(同样是发布一个web程序,除了程序之外,java需要安个java环境再安个应用服务器,nodejs需要安个nodejs语言环境,而go啥都不用安),但如果在裸机上跑四个编译后的程序,依赖库就是四份的体积了,而python之类只有一份,大家公用。不过这不太重要。

    重要的是Go最拿手的做网络服务器的能力,使用轻量级的协程,能胜任很大的并发量(几百万),而且协程是语言天生支持的,启动一个新协程直接go xxFun就好,xxFun是函数,Go里函数是一等对象。
    用基础库做网络编程,语法简单得令人发指,看书的第5章,个人的helloworld如下(更高深的还没研究):

    package main

    import (
        "bufio"
        "fmt"
        "io/ioutil"
        "log"
        "net"
        "net/http"
        "os"
    )

    func main() {
        //httpServer()
        //httpClient()
        //tcpClient()
        //tcpServer()
        test()
    }

    func test() {
        ch := make(chan int, 1)
        for{
            select {
                case ch <- 0:
                case ch <- 1:
            }
            i := <-ch
            fmt.Println("Value", i)
        }
    }

    func cmd() {
        for {
            reader := bufio.NewReader(os.Stdin)
            input, _ := reader.ReadBytes(' ')
            println(string(input[0 : len(input)-1]))
        }
    }

    //http服务器
    func httpServer() {
        http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
            w.Write([]byte("Hello"))
        })
        log.Fatal(http.ListenAndServe(":90", nil))
    }

    //http客户端
    func httpClient() {
        client := &http.Client{}
        reqest, _ := http.NewRequest("GET", "http://427studio.net", nil)
        response, _ := client.Do(reqest)
        if response.StatusCode == 200 {
            body, _ := ioutil.ReadAll(response.Body)
            bodystr := string(body)
            fmt.Println(bodystr)
        }
    }

    //tcp客户端
    func tcpClient() {
        conn, _ := net.Dial("tcp", "182.92.10.238:42769")//写
        fmt.Fprintf(conn, "getgames ")
        
        data, _ := bufio.NewReader(conn).ReadString(' ')//读
        fmt.Printf("%#v ", data)
    }

    //tcp服务器
    func tcpServer() {
        ln, err := net.Listen("tcp", ":6010")
        if err != nil {
            panic(err)
        }
        for {
            conn, err := ln.Accept()
            if err != nil {
                log.Fatal("get client connection error: ", err)
            }
            go _service(conn)
        }
    }
    //tcp服务器使用的服务函数
    func _service(conn net.Conn) {
        data, err := bufio.NewReader(conn).ReadString(' ')
        if err != nil {
            log.Fatal("get client data error: ", err)
        }
        fmt.Printf("%#v ", data)
        fmt.Fprintf(conn, "hello client ")
        conn.Close()
    }

    func checkErr(e error){
        if e != nil {
            fmt.Fprintf(os.Stderr, "%s", e.Error())
        }
    }

    目前就学了这点儿,明天想个点子做服务器+多客户端的命令行游戏玩玩。

    长期欢迎项目合作机会介绍,项目收入10%用于酬谢介绍人。新浪微博:@冷镜,QQ:908789432
  • 相关阅读:
    Python自学笔记(12day)
    Python自学笔记(11day)
    Python自学笔记(10day)
    Python自学笔记(9day)
    Python自学笔记(8day)
    form标签的使用
    form标签的使用法
    img标签的使用方法
    <a></a>标签的使用
    html的标签
  • 原文地址:https://www.cnblogs.com/zidafone/p/5031018.html
Copyright © 2011-2022 走看看