8月7日@黃同窗找我問:「數據存到redis是gzdeflate壓縮過的數據,golang從redis取出來,解壓縮失敗」。不少從PHP轉Golang的業務常常會遇到,因此寫下這篇博文,但願能夠幫助更多人。
想要使用golang解碼php的編碼,那麼就應該須要知道gzdeflate函數的算法是什麼,先到gzdeflate文檔,查看了一下發現:gzdeflate使用的是純粹的DEFLATE格式
。這就與golang的compress/flate
包一致了。有了瞭解就能夠看着golang文檔實現代碼了。遂與@黃同窗同窗寫了幾個函數進行驗證,最後定稿以下:php
package main import ( "strings" "fmt" "compress/flate" "bytes" "io/ioutil" ) func main() { str:="huangyupeng123" b:=Gzdeflate(str,-1) ss:=Gzencode(string(b)) fmt.Println(ss) /*str:="huangyupeng123" ss:=Gzdeflate(str,0) fmt.Println(ss) s=Gzencode(ss) fmt.Println(s)*/ } // 解碼 func Gzencode(data string) string { r :=flate.NewReader(strings.NewReader(data)) defer r.Close() out, err := ioutil.ReadAll(r) if err !=nil { fmt.Errorf("%s\n",err) } return string(out) } // 編碼 func Gzdeflate(data string,level int) []byte { var bufs bytes.Buffer w,_ :=flate.NewWriter(&bufs,level) w.Write([]byte(data)) w.Flush() w.Close() return bufs.Bytes() } // 編碼 func GzdeflateForString(data string,level int) string { var bufs bytes.Buffer w,_ :=flate.NewWriter(&bufs,level) w.Write([]byte(data)) w.Flush() defer w.Close() return bufs.String() }
通過@黃同窗同窗測試能夠正確使用。留下wiki供後續遇到的同窗查看。golang