Golang 方向是以高并发为主的开发语言,并且原生channel特性,拥有协程等并发框架支持,大大降低并发编程门槛,golang 是google 模仿erlang ,而erlang是用于程控交换机的。

对比之前用C++ ACE框架的并发模型(proactor),惊喜于Golang的高效,简捷。


Golang 十条有用的Go 编程技术:

  1. 使用单一的GOPATH,避免引用依赖不统一。当然可以使用godep这样的工具

  2. 将for-select 封装在函数中

    func main(){

        foo()

        fmt.Println("ending")

    }

    func foo(){

        for{

            select {

                case <- time.After(time.Second):

                    fmt.Println("hello")

                default:

                    return

            }

        }

    }

  1. 在初始化结构体时使用带有标签的语法,防止由于扩展结构体字段导致编译失败

    type T struct {

        Foo string

        Bar int

    }

    func main(){

        t := T{"example", 123} //无标签语法

        m :=T{

                   Foo:"example",

                   Bar:123

               } //有标签语法(推荐)

    }

3. 将结构体的初始化拆分到多行

4. 为整数常量添加String() 方法,利用print 的接口String

   const (

        Running State = iota

        Stopped

        Rebooting

        Terminated

    )

    func main(){

        state := Running //导致print 输出不直观

        fmt.Println("state ", state)

    }    

   //给 State 类型添加String()方法,使输出更加直观具体

   func(s State) String() string {

        switch s{

            case Running :

                return "Running"

            case Stopped :

                return "Stopped"

            case Terminated:

                return "Terminated"

            default:

                return "Unknown"

        }

    }

8.将slice, map等包装为自定义类型

type Servers []Server

func ListServers() Servers {

    return []Server{

        {Name: "wzz1"},

        {Name: "wzz2},

        {Name: "Foo1"},

        {Name: "Foo2"}

    }

}

func (s Servers) Filter(name string) Servers{

    filtered := make(Servers, 0)

    for _, server := range s{

        if strings.Contains(server.Name, name) {

            filtered = append(filtered, server)

        }

    }

    return filtered

}

func main() {

    servers := ListServers()

    servers = servers.Filter("Foo")

    fmt.Printf("server %+v\n", servers)


}


map 的设置节点用 setter, getter 包装,并且添加mu.lock() 因为map 是unsaft