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

推薦閱讀

本文歡迎轉發,轉發請注明作者和出處,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM