func split(key string,temp *string){
if len(key)<=64 {
*temp = *temp+key+"\n"
}
for i:=0;i<len(key);i++{
if (i+1)%64==0{
*temp = *temp+key[:i+1]+"\n"
fmt.Println(len(*temp)-1)
key = key[i+1:]
split(key,temp)
break
}
}
}
可以根据需要,把\n和64,修改成指定字符和指定长度,也可以写进形参数里,这里懒得改了,这里的业务场景是,对不具备头尾以及换行符的rsa 公钥//私钥 进行切割。
这里如果想要通过返回值的方式来split,只能定义一个全局变量temp,逐步切割吞吐给temp,而这显然不符合对象化的思想,即在一个工具包里,有var temp 这样的状态量.
还有一个大坑就是,可能写成:
for _,v:=range key{
key = key[0:i]+"\n"+key[i+1,:]
}
这样的话,这个for的key每次迭代都会变长,会出现越界错误,
所以用指针参数,就能达到伪全局变量效果
贴一下rsa 处理不带头尾public和private key的全部代码
...
func TestFormateKey(t *testing.T) {
rs := formatKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZsfv1qscqYdy4vY+P4e3cAtmvppXQcRvrF1cB4drkv0haU24Y7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0DgacdwYWd/7PeCELyEipZJL07Vro7Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NLAUeJ6PeW+DAkmJWF6QIDAQAB", 1, true)
t.Log(rs)
}
...
...
//key是否具有头尾换行不交由程序判断
//keyType=1,为key增加头尾,并每间隔64位换行
//ifPublic true 为公钥, false为私钥
//keyType=0,不变
func formateKey(key string, keyType int, ifPublic bool) string {
if keyType == 0 {
return key
}
if ifPublic {
var publicHeader = "\n-----BEGIN PUBLIC KEY-----\n"
var publicTail = "-----END PUBLIC KEY-----\n"
var temp string
split(key,&temp)
return publicHeader+temp+publicTail
}else{
var publicHeader = "\n-----BEGIN RSA PRIVATE KEY-----\n"
var publicTail = "-----END RSA PRIVATE KEY-----\n"
var temp string
split(key,&temp)
return publicHeader+temp+publicTail
}
}
func split(key string,temp *string){
if len(key)<=64 {
*temp = *temp+key+"\n"
}
for i:=0;i<len(key);i++{
if (i+1)%64==0{
*temp = *temp+key[:i+1]+"\n"
fmt.Println(len(*temp)-1)
key = key[i+1:]
split(key,temp)
break
}
}
}
...
结果:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZsfv1qscqYdy4vY+P4e3cAtmv
ppXQcRvrF1cB4drkv0haU24Y7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0Dgacd
wYWd/7PeCELyEipZJL07Vro7Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NL
AUeJ6PeW+DAkmJWF6QIDAQAB
-----END PUBLIC KEY-----