go語言請求介面的引數是二維時處理辦法

2021-10-18 18:36:05 字數 1453 閱讀 7700

專案從php遷移到go遇到這樣乙個問題,我們原來的專案是php寫的,請求第三方介面生成簽名的演算法是這樣的

private function _createsign($params = , $secret = '')

這個用go重寫簽名演算法,也很簡單

func createsign(param map[string]inte***ce{}, secret string) string 

sort.strings(keys)

uparams := url.values{}

for _, k := range keys

md5str := util.tomd5(uparams.encode() + secret)

return base64.stdencoding.encodetostring(byte(md5str))

}

主要是請求第三方的介面的引數是二維的,每次呼叫簽名演算法生成的簽名和php版本的都不一樣,導致請求第三方介面時,總是報簽名錯誤。

請求第三方介面的引數是這樣的

生成簽名

secret := "123456"

arrapiparam["c1"] = map[string]inte***ce{}

arrapiparam["c2"] = 55555

arrapiparam["sign"] = createsign(arrapiparam,secret)

傳送post請求

requestpost(url,arrapiparam)

如何讓createsign簽名演算法支援二維呢。改造簽名演算法如下:

思路就是,如果map的value是乙個map,就接著再遍歷。

func createsign(params map[string]inte***ce{},secret string) (string, error)  

sort.strings(keys)

uparams := url.values{}

for _, k := range keys else)

if ok

uparams.set(k + "[" + kk + "]",tostring(val))}}

} }md5str := util.tomd5(uparams.encode() + secret)

return base64.stdencoding.encodetostring(byte(md5str)),nil

}// convert inte***ce to string

func convert2stringcweb(s inte***ce{}) (string, error)

return val, nil

}

希望本文,對有同樣php轉go專案的朋友有幫助!

C 二維陣列作引數時和二維指標的異同

二維陣列不同於一位陣列,一維陣列傳引數時只需要傳指標即可,無需指定大小。二維做引數時必須指定第二維的大小,否則編譯不過。void lalala int a,int m,int n 編譯報錯void lalala int a 10 int m,int n 編譯通過因為對於表示式a i j 來說,編譯器...

go二維map Go語言 集合 Map 詳解

go語言 集合 map 詳解 部落格說明 說明map 是一種無序的鍵值對的集合。map 最重要的一點是通過 key 來快速檢索資料,key 類似於索引,指向資料的值。map 是一種集合,所以我們可以像迭代陣列和切片那樣迭代它。不過,map 是無序的,我們無法決定它的返回順序,這是因為 map 是使用...

go 宣告二維陣列 Go 語言學習之陣列

概念陣列是具有固定長度,並且有零個或多個相同資料型別元素的序列,陣列長度是陣列型別的一部分,也就是說 3 int 和 4 int 是兩個不同型別的陣列,二者不可以比較,陣列通過索引訪問元素,go 語言內建函式 len 可以返回陣列的長度,在 go 語言中,陣列是值傳遞。02 宣告陣列和初始化 在 g...