Go

关于 Go 项目在docker环境中的部署问题

Submitted by Lizhe on Fri, 09/20/2019 - 05:17

这个问题来自于 Colin 最近的一个新项目,这个项目的技术选型符合我心目中的完美项目

如果把 Vue 换成 React 看起来就更舒服了。

他们打算使用下面这种结构

20190920012411

实际上这个模型又回到了之前我的实习生小盆友的学习项目中的问题,

Colin 他们也使用了 golang 镜像,和实习生一样,他们认为和java镜像一样,既然我使用golang,那么我需要一个golang运行环境

但是这里,golang 本身不是 动态语言或者混合语言(像java那样,既JIT又有class解释器),它实际上是一种现代 C 语言

Go 多线程 (5) RWLock 读写锁

Submitted by Lizhe on Mon, 04/01/2019 - 07:31

读写锁的读行为不会造成同步

但是写行为会同时禁止 读/写 操作

例子很简单, 懒得写了网上找了一个, 下面可以看到读的时候没有阻塞

 

package main

 

import (

    "sync"

    "time"

)

 

var m *sync.RWMutex

 

func main() {

    m = new(sync.RWMutex)

 

    // 多个同时读

    go read(1)

    go read(2)

 

    time.Sleep(2 * time.Second)

}

 

func read(i int) {

    println(i, "read start")

 

    m.RLock()

    println(i, "reading")

Go 单元测试

Submitted by Lizhe on Fri, 10/26/2018 - 05:57

 

 

package lizhe

 

import (

    "errors"

)

 

func Division(a, b float64) (float64, error) {

    if b == 0 {

        return 0, errors.New("除数不能为0")

    }

 

    return a / b, nil

}

 

 

package lizhe

Go 反射

Submitted by Lizhe on Fri, 10/26/2018 - 03:23

package main

 

import (

    "fmt"

    "reflect"

)

 

type User struct {

    Id int

    Name string

    Age int

}

 

func (u User) Hello() {

    fmt.Println("Hello world!")

}

func Info(o interface{}) {

    t := reflect.TypeOf(o)

    fmt.Println("Type:", t.Name())

 

Go 读写mysql

Submitted by Lizhe on Thu, 10/25/2018 - 10:00

package main

 

import (

    "database/sql"

    "log"

 

    _ "github.com/go-sql-driver/mysql"

)

 

func checkErr(err error) {

 

    if err != nil {

 

        //log.Println(err)

 

    }

 

}

 

func main() {

 

Go 多线程 (4) sync.Pool

Submitted by Lizhe on Tue, 10/23/2018 - 07:26

sync.Pool 用于缓存

1. pool 可以减少GC对高并发的性能影响
2. 提供了对象重用
3. 并发安全
4. 仅受限于内存大小
5. 减少GC
6. 对象被删除时不会通知
7. 动态扩容或者收缩

package main

 

import (

    "log"

    "sync"

)

 

func main() {

    var intPool = sync.Pool{}

    for i := 0; i < 5; i++ {

        intPool.Put(i)

    }

    log.Println(intPool.Get())

Go 多线程 (3) channel 通道

Submitted by Lizhe on Tue, 10/23/2018 - 04:25

通道

atomic和互斥锁都可以保证线程安全, 不过在go语言里, 还有一种有趣的实现就是通道

package main

 

import (

    "fmt"

)

 

func main() {

    buffered := make(chan string, 10)

    buffered <- "hello world"

    value := <-buffered

    fmt.Println(value)

}

 

当一个资源需要在goroutine之间共享时, 通道在goroutine之间传递数据, 并且还提供了同步交换数据的机制.

Go 多线程 (2) sync.Mutex

Submitted by Lizhe on Mon, 10/22/2018 - 04:23

 

线程不安全的版本

package main

 

import (

    "fmt"

    "runtime"

    "sync"

)

 

var (

    count int32

    wg sync.WaitGroup

)

 

func main() {

    wg.Add(2)

    go addValue()

    go addValue()

    wg.Wait()

    fmt.Println(count)

}

 

func addValue() {

    defer wg.Done()

Go 多线程 (1) waitgroup

Submitted by Lizhe on Mon, 10/22/2018 - 03:43

 

下面的代码创建了两个匿名的异步函数, 然后通过waitgroup来等待这两个异步方法

package main

 

import (

    "fmt"

    "sync"

)

 

func main() {

    var wg sync.WaitGroup

    wg.Add(2)

    fmt.Println("Started...")

 

    go func() {

        defer wg.Done()

        fmt.Println("first thread finished")

    }()

 

    go func() {