分类 Go 下的文章

在go中写配置文件 这样写

Cfg, err = ini.Load("conf/app.ini")

或者配置模板目录这样写

 router.LoadHTMLGlob("templates/*")

然后单元测试的时候,偏偏又找不到文件目录。

  1. 设置系统全局路径

    router.LoadHTMLGlob(filepath.Join(os.Getenv("GOPATH"),"/src/gin_curd/templates/*"))
    

2.利用模式 重写路径

if mode := gin.Mode(); mode == gin.TestMode {

router.LoadHTMLGlob("./../templates/*")

} else {

router.LoadHTMLGlob("templates/*")

}

参考:

golang单元测试时关于相对路径的处理问题?

聊一聊,Golang “相对”路径问题

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

当golang的对象需要和json做转换的时候,我们就经常用到这个特性。
有两点注意的地方:

1.如果一个域不是以大写字母开头的,那么转换成json的时候,这个域是被忽略的。

2.如果没有使用json:"name"tag,那么输出的json字段名和域名是一样的。

总结一下,json:"name"格式串是用来指导json.Marshal/Unmarshal,在进行json串和golang对象之间转换的时候映射字段名使用的。

空接口(empty interface)

空接口比较特殊,它不包含任何方法:

interface{}

在Go语言中,所有其它数据类型都实现了空接口。

var v1 interface{} = 1
var v2 interface{} = "abc"
var v3 interface{} = struct{ X int }{1}

如果函数打算接收任何数据类型,则可以将参考声明为interface{}。最典型的例子就是标准库fmt包中的Print和Fprint系列的函数:

func Fprint(w io.Writer, a ...interface{}) (n int, err error) 
func Fprintf(w io.Writer, format string, a ...interface{})
func Fprintln(w io.Writer, a ...interface{})
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{})
func Println(a ...interface{}) (n int, err error)

注意,[]T不能直接赋值给[]interface{}

t := []int{1, 2, 3, 4}
var s []interface{} = t

编译时会输出下面的错误:

cannot use t (type []int) as type []interface {} in assignment

我们必须通过下面这种方式:

t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}