数据库读写锁的作用与注意事项

review的项目代码

db.go:

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
38
39
package main

import (
"fmt"
"github.com/go-xorm/xorm"
_ "github.com/lib/pq"
"log"
"xorm.io/core"
)

type People struct {
Id int `xorm:"not null pk autoincr"`
Age int `xorm:"unique"` // 增加 unique
Name string
}

var engine *xorm.Engine

func init() {
host := "localhost"
port := 5432
user := "postgres"
password := "root"
dbName := "test"
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbName)
var err error
engine, err = xorm.NewEngine("postgres", psqlInfo)
if err != nil {
log.Fatal(err)
}
engine.SetTableMapper(core.SameMapper{})
err = engine.Sync2(new(People)) // 在表存在的情况下,结构增加 unique 后,sync2() 时会自动给表建立索引。
if err != nil {
log.Fatal(err)
}
engine.SetMaxIdleConns(100)
engine.SetMaxIdleConns(100)
engine.ShowSQL(false)
}

阅读全文

linux挂载

挂载是 “/‘ 和 ”/home“ 不是重复了吗?

inux下面所有的文件、目录、设备都有一个路径,这个路径永远以/开头,用/分隔,如果一个路径是另一个路径的前缀,则这两个路径有逻辑上的父子关系。但是并不是所有逻辑上的父子关系都必须要是同一个设备,决定不同路径对应到哪个设备的机制就叫做mount(挂载)。

阅读全文

time.Time 转 json 的封装

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
package main

import (
"encoding/json"
"fmt"
"time"
)

type Student struct {
Id int64 `json:"id,string"`
Name string `json:"name"`
CreateTime MyTime `json:"create_time"`
UpdateTime time.Time `json:"update_time"`
}
func main() {
s1 := Student{Id:1,Name: "xmge"}
b,err := json.Marshal(s1)
fmt.Println(string(b),err)

s2 := new(Student)
err = json.Unmarshal(b,s2)
fmt.Println(s2,err)

b2,err := json.Marshal(s2)
fmt.Println(string(b2),err)
}

type MyTime time.Time

func (mt MyTime)MarshalJSON() ([]byte,error) {
t := time.Time(mt)
if t.IsZero() {
return []byte("null"),nil
}
return t.MarshalJSON()
}

阅读全文

读源码有什么用?

通过阅读源码/注释有什么用呢?

  1. 可以让你发现你使用的工具包有哪些你不知道的功能,
  2. 可以编写更高性能更优雅的代码,
  3. 可以排除一些疑难杂症。

阅读全文

三目运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"fmt"
)

func main() {
a:= If(5>3,1,2) // go vet can't pass
fmt.Println(a)
}


func If(condition bool, trueVal, falseVal interface{})interface{} {
if condition {
return trueVal
}
return falseVal
}

阅读全文

内存泄漏排查记录(一)

一、发现问题

首先通过监控工具查看到某个项目的机器内存在部署之后总是不断上涨,但是用户量并不多,很明显是内存泄漏的问题。

监控

阅读全文

remotessh

想 ssh 远程连接服务器,并批量执行命令,结果发现 echo $(pwd) 在本地执行,echo "bbb" >> b.txt 却在服务器端执行

通过给第一个 remotessh 加双引号即可解决。

阅读全文

编程规范

  1. 少用标志位,多用方法。能不加变量就不要加变量,最好不用变量。
  2. 尽量少用 init(),什么时候使用? 当你的其他程序运行时与包含 init 函数无关,只有在使用它时自动 init 即可

阅读全文

getter-setter的重要性

  1. 通过设置get/set方法,可以保证内部变量的安全性,而且还可以在get中设置默认值。否则在程序中,如果 configVersion 不存在,程序会进行不下去。
  2. _sharedConfig 是 uber 的非导出常量的规范。
    img

阅读全文

接口类型检查

1
2
3
// Make sure a Hash implements the hash.Hash and hash.Hash64 interfaces.
var _ hash.Hash = &Hash{}
var _ hash.Hash64 = &Hash{}

阅读全文