Go - 函数

概述

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

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


运行结果:

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


运行结果:


获取当前时间字符串

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


运行结果:


获取当前时间戳

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


运行结果:

生成签名

 

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

猜你喜欢

转载自www.cnblogs.com/it-3327/p/11869449.html