Go

Go 闭包

Submitted by Lizhe on Wed, 09/13/2017 - 10:59

package main

import (
    "fmt"
)

func main() {
    function := squares()
    fmt.Println(function())
    fmt.Println(function())
    fmt.Println(function())
    fmt.Println(function())
}

func squares() func() int {
    var x int
    return func() int {
        x++
        return x*x
    }
}

 

Go html template

Submitted by Lizhe on Tue, 09/12/2017 - 11:39

 

package main

import (
    "html/template"
    "os"
)

func main() {
    const tpl = `hello {{.}}`
    data := "world"

    t, err := template.New("").Parse(tpl)
    if err == nil {
        t.Execute(os.Stdout, data)
    }

}
 

使用结构体

Go 中文字符串处理

Submitted by Lizhe on Fri, 09/01/2017 - 11:37

Go语言本身是使用utf8的, 不过在处理字符串的时候仍然需要注意一些事情

问题很简单,直接看例子吧

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    str := "这是一个测试字符串"
    fmt.Println(str)
    fmt.Println(utf8.RuneCountInString(str))
    fmt.Println(utf8.DecodeRuneInString(str))

Go map ++

Submitted by Lizhe on Mon, 08/28/2017 - 17:23

今天发现go的map结构居然可以直接用 ++ 当值... 好神奇

记录一下

package app

import (
    "bufio"
    "fmt"
    "os"
)

Go debug

Submitted by Lizhe on Mon, 08/28/2017 - 12:08

首先你需要知道几个概念

Go语言输出的exe需要使用gdb(The GNU Project Debugger) 来调试

gdb调试时如果go是64位的, 那么对应的gdb也需要使用64位的

在windows下使用gdb需要gdb.exe, 但是有些版本可能不兼容,如果发现莫名其妙的错误可以尝试换个版本,如果你找不到可用版本我推荐你直接使用liteide自带的版本

 

1 使用liteide 调试

下载liteide    http://liteide.org/en/

然后需要一些简单配置

点击那个console图标,然后配置

474

Go 并发

Submitted by Lizhe on Thu, 08/24/2017 - 15:41

Go语言最大的一个特点就是对并发的原生支持

Go的并发指的是能让某个函数独立于其他函数运行的能力.

当一个函数创建为goroutine时, Go会将其视为一个独立的工作单元. 这个单元会被调度到任何可用的逻辑处理上执行.

Go的运行时调度器能管理被创建的goroutine并为他们分配执行时间.

Go基于叫做CSP ( Communicating Sequential Processes ) 的并发同步模型来保证数据的线程安全, CSP是一种消息传递模型, 通过在goroutine之间传递数据来传递消息,而不是对数据进行加锁来来实现同步访问, 用于传递数据的关键数据类型叫做channel

package main

import (
    "fmt"
    "runtime"
    "sync"
)

Go init函数

Submitted by Lizhe on Thu, 08/24/2017 - 12:24

init函数和main函数一样是go语言中的保留函数,由go自动调用

main函数只能应用于main包中, 但是init函数可以使用在任意包中

init函数会在包被导入时自动执行(在常量和变量初始化之后)

 

我们使用下面的例子进行验证

C:\DEV\workspace_angularjs\GoHelloInit\src\main\main.go

package main

import (
    t "testinit"
)

func main(){
    t.SayHello()
}

C:\DEV\workspace_angularjs\GoHelloInit\src\testinit\app.go

Go语言的微服务搭建

Submitted by Lizhe on Wed, 08/23/2017 - 18:02

 

Negroni是一个第三方库,用于在Go内置的net/ http包上构建路由接口

gorilla/mux是一个强大的路由,小巧但是稳定高效,不仅可以支持正则路由还可以按照Method,header,host等信息匹配,可以从我们设定的路由表达式中提取出参数方便上层应用,而且完全兼容http.ServerMux

 

package main

import (
    service "service"
)

func main(){
    port := "8888"
    server := service.NewServer()
    server.Run(":"+port)
}