go 学习笔记

96
zhaozhengcoder
2019.05.19 15:48* 字数 695

go学习的笔记

什么是go

看到云风在博客里面写的一句话 :

我发现我花了四年的时间锤炼自己用C语言构建系统的能力,试图找到一个规范,可以更好的编写软件。结果发现只是对go的模仿。

利用周末空余的时间,速成了一下go的语法。我感觉go的有一点是比较吸引我的。

  1. 强类型
  • 写过python,python的弱类型在写起来是比较爽的,但是n天之后,回来再看。基本上是看不出来一个变量的里面的维度的。(维护起来,非常痛苦,除非是一次性的代码)

  • 需要编译
    一些低级的错误,在编译的时候就可以发现。不至于服务已经部署好了,对外提供之后,发现一个底层的错误,造成问题。

  1. 语言层面支持并发,而不是像其他语法需要一个xxx的框架,才可以实现并发。
    go在设计上面遵循,不要通过共享来通信,而是通过通信来共享。

  2. 编码的感觉 = c++ && python
    性能接近c++,编码的效率接近python

基本语法

找个网上面的教程速学了一下语法:

  1. https://www.kancloud.cn/kancloud/the-way-to-go
  2. https://www.runoob.com/go/go-ide.html
搞一点小东西
  1. 多线程求解斐波那契数列

单线程的写法:

package main

import (
        "fmt"
        //"time"
)

func fab(num int) int{
    if num == 0 {
        return 0
    } else if num == 1 {
        return 1
    } else {
        return fab(num-1)+fab(num-2)
    }
}

func main() {
    fmt.Println(fab(50))
    fmt.Println(fab(49))
}

多线程的写法:

package main

import (
        "fmt"
        //"time"
)

func fab(num int) int {
    if num == 0 {
        return 0
    } else if num == 1 {
        return 1
    } else {
        return fab(num-1)+fab(num-2)
    }
}

func get_fab(num int,c chan int) {
    var res int = fab(num)
    c <- res
}

func main() {
    c := make(chan int)

    go get_fab(50, c)
    go get_fab(49, c)
    var res1, res2 = <-c, <-c 

    fmt.Println(res1)
    fmt.Println(res2)

    fmt.Println("res : ",res1+res2)
}

对应的输出:

$ time go run concurrent.go
12586269025
7778742049

real    4m31.171s
user    0m0.015s
sys     0m0.015s

$ time go run concurrent2.go
7778742049
12586269025
res :  20365011074

real    2m36.948s
user    0m0.000s
sys     0m0.047s

程序1 是单线程的计算,程序2是两个线程去计算。go的多线程的写法非常的方便。从程序的执行结果也可以看出,多线程的写法的计算速度是比较快的。如果观察cpu的利用率,发现程序2的效率是200%。 这个也是符合逻辑的。

多线程和单线程的对比的结果,基本上是预料之中的。写这段代码,主要是学习一下go的并发。go并发的实现是通过goroutine的方式在做的,在使用的时候,还是很舒服的。起码比c++方便很多很多。

  1. 接入服务器

这个服务会监停一个端口,允许外部多个连接的接入,并可以把这个连接上的数据包汇总发到后端的一个连接上。简单的说,就是一个 N 对 1 的数据处理器。把 N 个 TCP 数据流合成一个数据流。


参考:

  1. https://blog.codingnow.com/2010/11/go_prime.html
go入门
Gupao