1.1 概述

学习了一些基础语法,开始学习写函数了,分享几个自己写的函数。

  • MD5
  • 获取当前时间戳
  • 获取当前时间字符串
  • 生成签名

1.2 函数定义

1
2
3
4
5
func function_name(input1 type1, input2 type2) (type1, type2) {
// 函数体
// 返回多个值
return value1, value2
}
  • 函数用 func 声明。
  • 函数可以有一个或多个参数,需要有参数类型,用 , 分割。
  • 函数可以有一个或多个返回值,需要有返回值类型,用 , 分割。
  • 函数的参数是可选的,返回值也是可选的。

1.3 值传递

传递参数时,将参数复制一份传递到函数中,对参数进行调整后,不影响参数值。

Go 语言默认是值传递。

1.4 引用传递

传递参数时,将参数的地址传递到函数中,对参数进行调整后,影响参数值。

这个是 [Go - Struct 结构体]的例子:

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
//demo_13.go
package main

import (
"encoding/json"
"fmt"
)

type Result struct {
Code int `json:"code"`
Message string `json:"msg"`
}

func main() {
var res Result
res.Code = 200
res.Message = "success"
toJson(&res)

setData(&res)
toJson(&res)
}

func setData (res *Result) {
res.Code = 500
res.Message = "fail"
}

func toJson (res *Result) {
jsons, errs := json.Marshal(res)
if errs != nil {
fmt.Println("json marshal error:", errs)
}
fmt.Println("json data :", string(jsons))
}

运行结果:

1.5 MD5

1
2
3
4
5
6
7
8
9
// MD5 方法
func MD5(str string) string {
s := md5.New()
s.Write([]byte(str))
return hex.EncodeToString(s.Sum(nil))
}

str := "12345"
fmt.Printf("MD5(%s): %s\n", str, MD5(str))

运行结果:

1.6 获取当前时间字符串

1
2
3
4
5
6
// xxxx-xx-xx xx:xx:xx
func getTimeStr() string {
return time.Now().Format("2006-01-02 15:04:05")
}

fmt.Printf("current time str : %s\n", getTimeStr())

运行结果:

1. 7 获取当前时间戳

1
2
3
4
5
6
7
// 获取当前时间戳
func getTimeInt() int64 {
return time.Now().Unix()
}

fmt.Printf("current time str : %s\n", getTimeStr())
fmt.Printf("current time unix : %d\n", getTimeInt())

运行结果:

1. 8生成签名

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
40
41
42
43
44
45
46
47
48
//demo_26.go
package main

import (
"crypto/md5"
"encoding/hex"
"fmt"
"sort"
)

func main() {
params := map[string]interface{} {
"name" : "Tom",
"pwd" : "123456",
"age" : 30,
}
fmt.Printf("sign : %s\n", createSign(params))
}

// MD5 方法
func MD5(str string) string {
s := md5.New()
s.Write([]byte(str))
return hex.EncodeToString(s.Sum(nil))
}

// 生成签名
func createSign(params map[string]interface{}) string {
var key []string
var str = ""
for k := range params {
key = append(key, k)
}
sort.Strings(key)
for i := 0; i < len(key); i++ {
if i == 0 {
str = fmt.Sprintf("%v=%v", key[i], params[key[i]])
} else {
str = str + fmt.Sprintf("&xl_%v=%v", key[i], params[key[i]])
}
}
// 自定义密钥
var secret = "123456789"

// 自定义签名算法
sign := MD5(MD5(str) + MD5(secret))
return sign
}

运行结果:

对应 PHP 生成签名方法:

有兴趣的可以在签名方法中,增加时间戳 和 secret 在配置文件中读取。