配置文本编辑器
通过使用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
有疑问加站长微信联系(非本文作者)