go调度之-为什么先打印10呢?

代码

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

import (
"fmt"
"runtime"
"sync"
)

func main() {

runtime.GOMAXPROCS(1)

var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
}

wg.Wait()
}

阅读全文

go-syscall-保证系统单例

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

import "syscall"

const LockFile = "singleton.lock"

func Singleton() {
if fd, err := syscall.Open(LockFile, syscall.O_CREAT|syscall.O_RDONLY, 0644); err != nil {
panic(err)
} else if err := syscall.Flock(fd, syscall.LOCK_EX|syscall.LOCK_NB); err != nil {
panic(err)
}
return
}

阅读全文

Postgres-InsertOrUpdate

1
2
3
4
5
6
7
8
9
10
11
func (um *Model) InsertOrUpdate(session *xorm.Session) (int64, error) {

sql := fmt.Sprintf(`INSERT INTO %s (id,user_id,mine_id,status) VALUES(?,?,?,?)
ON CONFLICT (user_id,mine_id) DO UPDATE SET
status = ?;`, um.TableName())
result, err := session.SQL(sql, um.Id, um.UserId, um.MineId, um.Status).Execute()
if err != nil {
return -1, err
}
return result.RowsAffected()
}

阅读全文

http服务启动检车 check.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
package check

import (
"errors"
"log"
"net/http"
"time"
)

func ApiCheck() {
if err := PingServer(); err != nil {
log.Fatal("The router has no response, or it might took too long to start up.")
}
log.Println("The router has been deployed successfully.")
}

func PingServer() error {
for i := 0; i < 10; i++ {
URL := "http://localhost:8080"
resp, err := http.Get(URL + "/health")
if err == nil && resp.StatusCode == 200 {
return nil
}
time.Sleep(time.Second)
}
return errors.New("cannot connect to the router")
}

阅读全文

LRU算法

LRU缓存淘汰算法

LRU是最近最少使用策略的缩写,是根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

阅读全文

golang-while

Go 语言没有 while 和 do…while 语法,可以通过 for 循环来实现其使用效果。

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

import "fmt"

func main() {
While()
DoWhile()
}

func While() {
i := 1
for {
fmt.Println("hello! ", i)
i++
if i > 10 {
break
}
}
}

func DoWhile() {
i := 1
for {
if i > 10 {
break
}
fmt.Println("hello! ", i)
i++

}
}

阅读全文

结构体零值

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

type Student struct {
Name string
Age string
}

func main() {
var sp *Student // 零值为 nil
var s Student // 不可与 nil 比较,零值为其中各个字段为 零值
s.Name = "xmge" // ok
sp.Name = "xmge" // error
}

//panic: runtime error: invalid memory address or nil pointer dereference

阅读全文

github.com-olahol-melody-websocket框架

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

import (
"fmt"
"os"
"github.com/urfave/cli"
)

func main() {
app := cli.NewApp()
app.Commands = []cli.Command{
{
Name: "test",
Usage: "test --uid=x --username=y",
Action: (&Command{}).Test,
Flags: []cli.Flag{
cli.IntFlag{Name: "uid",Usage:"--uid"},
cli.StringFlag{Name:"username",Usage:"--username"},
},
},
}
err := app.Run(os.Args)
if err != nil {
fmt.Print("command error :" + err.Error())
}
}

阅读全文

no-title

package main

import (
“fmt”
“math/big”
)

func main() {
//设置一个大于int64的数
a := new(big.Int)
a, ok := a.SetString(“9122322238215458478512545454878168716584545412154785452142499999”, 10)
if !ok {
panic(“error”)
}
//String方法可以转换成字符串输出
fmt.Println(a.String())

阅读全文

go-big包大数运算

应用场景

当我们进行浮点数进行(+ - * /)运算时,容易造成精度丢失,于是使用 big 包来处理。

使用步骤如下:

  1. 用 float64 变量构建 Big 对象。

阅读全文