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
| 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
| 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
| 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
| 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 在配置文件中读取。