概述

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

  • MD5

  • 获取当前时间戳

  • 获取当前时间字符串

  • 生成签名

函数定义

 func function_name(input1 type1, input2 type2) (type1, type2) {
    // 函数体
    // 返回多个值
    return value1, value2
 }
  • 函数用 func 声明。

  • 函数可以有一个或多个参数,需要有参数类型,用 , 分割。

  • 函数可以有一个或多个返回值,需要有返回值类型,用 , 分割。

  • 函数的参数是可选的,返回值也是可选的。

值传递

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

Go 语言默认是值传递。

引用传递

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

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

 //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))
 }

运行结果:

image

MD5

 // 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))

运行结果:

image

获取当前时间字符串

 // 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())

运行结果:

image

获取当前时间戳

 // 获取当前时间戳
 func getTimeInt() int64 {
     return time.Now().Unix()
 }
 ​
 fmt.Printf("current time str : %s\n", getTimeStr())
 fmt.Printf("current time unix : %d\n", getTimeInt())

运行结果:

image

生成签名

 //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
 }

运行结果:

image

对应 PHP 生成签名方法:

image

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