挂载配置文件到应用程序所在的目录

应用程序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package main

import (
"fmt"
"io"
"io/ioutil"
"log"
"net/http"

"gopkg.in/yaml.v2"
)

type config struct {
Port string `yaml:"port"`
}

var c = new(config)

func init() {
fContent, err := ioutil.ReadFile("config.yaml")
if err != nil {
log.Fatal(err)
}

if err = yaml.Unmarshal(fContent, c); err != nil {
log.Fatal(err)
}
}

func main() {
handlerFunc := func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello !")
}

http.HandleFunc("/", handlerFunc)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", c.Port), nil))
}

阅读更多

Golang的 sync mutex是阻塞互斥锁,在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex,使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁。但有时逻辑里面需要 非阻塞模式的拿锁 及 非阻塞得知锁的状态。trylock, 可以用非阻塞的模型进行拿锁,要么拿到锁,要么锁被别人拿到。 islocked, 就是判断锁的状态。

阅读更多

go mod

用上 Go module 之后,发布的版本都在 v1 上面,用了这么长时间遇到了升级 v2 版本的问题。记录一下

  • Go module 版本号
  • Go 项目如何升级 v2
  • incompatible
  • v0.0.0-20190312205133-abcdefghijklm
  • tag 删除了重建为什么没效果

阅读更多

在网络编程中,经常用http.Post 发送文件到远程服务器,可以通过自己构造multipart/form-data; boundary来实现。

一般是这么做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
buf := new(bytes.Buffer)
writer := multipart.NewWriter(buf)
defer writer.Close()
part, err := writer.CreateFormFile("myFile", "foo.txt")
if err != nil {
return err
}
file, err := os.Open(name)
if err != nil {
return err
}
defer file.Close()
if _, err = io.Copy(part, file); err != nil {
return err
}
http.Post(url, writer.FormDataContentType(), buf)

阅读更多

前言

viper

viper 的功能

  1. 支持Yaml、Json、 TOML、HCL 等格式的配置
  2. 可以从文件、io、环境变量、command line中提取配置
  3. 支持自动转换的类型解析
  4. 可以远程从etcd中读取配置

阅读更多

goto

goto 语句可以无条件地转移到过程中指定的行。

通常与条件语句配合使用。可用来实现条件转移,构成循环,跳出循环体等功能。

在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱。

goto对应(标签)既可以定义在for循环前面,也可以定义在for循环后面,当跳转到标签地方时,继续执行标签下面的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func main() {
// 放在for前面,此例会一直循环下去
Loop:
fmt.Println("test")
for a:=0;a<5;a++{
fmt.Println(a)
if a>3{
goto Loop
}
}
}

func main() {
for a:=0;a<5;a++{
fmt.Println(a)
if a>3{
goto Loop
}
}
Loop: //放在for后边
fmt.Println("test")
}

阅读更多