Go经典入门(二)

忘却° · · 446 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

配置文本编辑器
通过使用go插件,提高工作效率
命名约定
  • 以大写字母命名的标识符将被导出,以小写字母命名的标识符不会被导出
  • 使用驼峰法
  • 使用简短变量类型名,如 i,s,b
  • 接口动词加上er表示操作,如Reader
使用golint

go get - u github.com/golang/lint/golint

使用godoc

go get golang.org/x/tools/
godoc ./example03
godoc -http=”:6060”

工作流程自动化

makefile

测试和性能
测试:软件开发最重要的方面
单元测试
针对一小段代码的独立测试
集成测试
测试应用各部分协同工作的情况
功能测试
端到端测试或由外向内的测试
测试驱动开发

TDD

testing包

测试代码和源代码放在一个包内 以_test结尾
测试是以Test开头的函数
go want 模式

运行表格驱动测试
基准测试 以Benchmark开头的测试 测试时间

func BenchmarkString
go test -bench=.

提供测试覆盖率

go test -v ./... -coverprofile=cover.out #生成覆盖率输出

调试

处理JSON
json简介

是一种人类能够看懂的灵活而轻量级的数据格式

使用JSON API
在Go语言中使用JSON

omitempty //忽略空值
type  Person struct {
     Name string `json:"name,omitempty"`
     Age int `json:"age,omitempty"`
     Hobbies []string `json:"hobbies,omitempty"`
}

func test1()  {
    hobbies := []string{"Cycling","Cheese","Techno"}
    p := Person{
        Name:    "George",
        Age:     40,
        Hobbies: hobbies,
    }
    fmt.Printf("%+v\n",p)
    jsonByteData,err := json.Marshal(p)
    if err != nil {
         log.Fatal(err)
    }
    jsonStringData := string(jsonByteData)
    fmt.Println(jsonStringData)

}

解码JSON

func test1()  {
    hobbies := []string{"Cycling","Cheese","Techno"}
    p := Person{
        Name:    "George",
        Age:     40,
        Hobbies: hobbies,
    }
    fmt.Printf("%+v\n",p)
    jsonByteData,err := json.Marshal(p)
    if err != nil {
         log.Fatal(err)
    }
    jsonStringData := string(jsonByteData)
    fmt.Println(jsonStringData)
    err2 := json.Unmarshal(jsonByteData,&p)
    if err2 != nil {
        log.Fatal(err2)
    }
    fmt.Printf("%+v\n",p)
}

映射数据类型
处理通过HTTP收到的JSON

处理文件
文件的重要性

unix中 一切皆为文件

使用ioutil 包读写文件
读取文件

func test2()  {
    fileBytes,err := ioutil.ReadFile("example.txt")
    if err != nil {
         log.Fatal(err)
    }
    fmt.Println(fileBytes)
    fileString := string(fileBytes)
    fmt.Println(fileString)
}

创建文件 0644 权限

func test3()  {
    b := make([]byte,0)
    err := ioutil.WriteFile("example01.txt",b,0644)
    if err != nil {
        log.Fatal(err)
    }
}

写入文件


func test4()  {
    s := "Hello World"
    err := ioutil.WriteFile("example01.txt",[]byte(s),0644)
    if err != nil {
        log.Fatal(err)
    }
}

列出目录的内容

func test5()  {
    files,err :=  ioutil.ReadDir(".")
    if err != nil {
         log.Fatal(err)
    }
    for _,file := range  files{
        fmt.Println(file.Mode(),file.Name())
    }
}

复制文件

func test6()  {
    from,err := os.Open("./example01.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer from.Close()
    to,err2 := os.OpenFile("./example01.copy.txt",os.O_RDWR|os.O_CREATE,0666)
    if err2 != nil {
        log.Fatal(err2)
    }
    defer to.Close()
    _,err1 := io.Copy(to,from)
    if err1 != nil {
        log.Fatal(err1)
    }
}

删除文件

func test7()  {
    err := os.Remove("./example01.copy.txt")
    if err != nil {
        log.Fatal(err)
    }
}

使用文件来管理配置
使用JSON文件

func  test8()  {
    f,err := ioutil.ReadFile("config.json")
    if err != nil {
        log.Fatal(err)
    }
    c := Config{}
    err = json.Unmarshal(f,&c)
    if err != nil {
         log.Fatal(err)
    }
    fmt.Printf("%+v\n",c)
}

使用TOML文件

正则表达式简介
定义正则表达式

func test9()  {
    needle:="chocolate"
    haystack := "Chocolate is my favorite!"
    match,err := regexp.MatchString(needle,haystack)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(match)
}

正则表达式语法
使用正则表达式验证数据

func test10()  {
    re := regexp.MustCompile("^[a-zA-Z0-9]{5,12}")
    fmt.Println(re.MatchString("slimshady99"))
    fmt.Println(re.MatchString("!asdf45dc"))
    fmt.Println(re.MatchString("roger"))
}

使用正则表达式来变换数据
replace

Go语言时间编程
时间元素编程

fmt.Println(time.Now())

让程序休眠

time.Sleep(3 *time.Second)

设置超时时间


func test11()  {
    fmt.Println("You have two seconds to calculate 19 *4")
    for  {
        select {
        case <-time.After(2 * time.Second):
            fmt.Println("Time up!")
            return
        }
    }
}

使用ticker定时

func test12()  {
    c := time.Tick(5 * time.Second)
    for t := range c{
        fmt.Printf("The time is now %v\n",t)
    }
}

以字符串格式表示时间


func test13()  {
    s := "2020-01-02T15:04:05+07:00"
    t,err:=time.Parse(time.RFC3339,s)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(t)
}

使用结构体Time

fmt.Println(t.Hour())
fmt.Println(t.Minute())
fmt.Println(t.Second())
fmt.Println(t.Day())
fmt.Println(t.Month())
fmt.Println(t.Unix())

时间加减

t.Add(2 * time.Second)

比较两个不同的Time结构体

func test13() {
    s1 := "2020-01-02T15:04:05+07:00"
    s2 := "2020-02-02T15:04:05+07:00"
    today, err := time.Parse(time.RFC3339, s1)
    if err != nil {
        log.Fatal(err)
    }

    tomorrow, err1 := time.Parse(time.RFC3339, s2)
    if err1 != nil {
        log.Fatal(err1)
    }
    fmt.Println(today.After(tomorrow))
    fmt.Println(today.Before(tomorrow))
    fmt.Println(today.Equal(tomorrow))
}

部署Go语言代码
理解目标
go env
压缩二进制文件大小
使用Docker

FROM golang:1.9
COPY example02.go
RUN go build -o /example/example02.go
EXPOSE 8000
ENTRYPOINT ["/example02"]

下载二进制文件
使用go get
通过包管理器发布代码
homebrew


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:忘却°

查看原文:Go经典入门(二)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

446 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传