1.1 概述
学习了一些基础语法,开始学习写函数了,分享几个自己写的函数。
- MD5
- 获取当前时间戳
- 获取当前时间字符串
- 生成签名
1.2 函数定义
| 12
 3
 4
 5
 
 | func function_name(input1 type1, input2 type2) (type1, type2) {
 
 return value1, value2
 }
 
 | 
- 函数用 func声明。
- 函数可以有一个或多个参数,需要有参数类型,用 ,分割。
- 函数可以有一个或多个返回值,需要有返回值类型,用 ,分割。
- 函数的参数是可选的,返回值也是可选的。
1.3 值传递
传递参数时,将参数复制一份传递到函数中,对参数进行调整后,不影响参数值。
Go 语言默认是值传递。
1.4 引用传递
传递参数时,将参数的地址传递到函数中,对参数进行调整后,影响参数值。
这个是 [Go - Struct 结构体]的例子:
| 12
 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
 
 | 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
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | 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 获取当前时间字符串
| 12
 3
 4
 5
 6
 
 | func getTimeStr() string {
 return time.Now().Format("2006-01-02 15:04:05")
 }
 
 fmt.Printf("current time str : %s\n", getTimeStr())
 
 | 
运行结果:

1. 7 获取当前时间戳
| 12
 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生成签名
| 12
 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
 
 | 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))
 }
 
 
 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 在配置文件中读取。