Golang 方向是以高并发为主的开发语言,并且原生channel特性,拥有协程等并发框架支持,大大降低并发编程门槛,golang 是google 模仿erlang ,而erlang是用于程控交换机的。
对比之前用C++ ACE框架的并发模型(proactor),惊喜于Golang的高效,简捷。
Golang 十条有用的Go 编程技术:
使用单一的GOPATH,避免引用依赖不统一。当然可以使用godep这样的工具
将for-select 封装在函数中
func main(){
foo()
fmt.Println("ending")
}
func foo(){
for{
select {
case <- time.After(time.Second):
fmt.Println("hello")
default:
return
}
}
}
在初始化结构体时使用带有标签的语法,防止由于扩展结构体字段导致编译失败
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