分享
  1. 首页
  2. 文章

golang编程常见问题

道闻 · · 1103 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1. gitlab/github提交非项目文件(如编译后的二进制文件).

使用.gitignore来忽略提交的文件

2. 使用字符串拼接JSON问题

举例:

responseString := "{ \"code\" : \"0\" , \"data\": { \"username\": " + username + " }}"

return []byte(responseString)

如上代码块,因username从外部传入,有JSON注入风险,最佳方法为:使用json.Marshal结构体封装返回值

// JSONStyle return http.data like json style

type JSONStyle struct {

Code string `json:"code"`

Data struct {

Username string `json:"username"`

} `json:"data"

}

var jsonData JSONStyle

jsonData.Code = code

jsonData.Data.Username = username

result, err := json.Marshal(jsonData)

if err != nil {

fmt.Println("struct convert to json bytes fail")

return nil

}

return result

3. 针对form提交的数据,对输入参数校验不足

需要对输入参数做校验,通常使用form validation的一些库,如 github.com/astaxie/beego/validation

username := req.Form.Get("username")

userpass := req.Form.Get("userpass")

valid := validation.Validation{}

valid.Length(userpass, 32, "userpass")

valid.MinSize(username, 6, "username")

valid.MaxSize(username, 20, "username")

4. 函数结构中if嵌套过多,正常返回包含在if中

举例:

username = req.Form.Get("username")

userpass = req.Form.Get("password")

if username != "" {

user := LoginIn(username, userpass)

if (user != nil) && (user.Username != "") {

//if login success, cookie data to mem.

return true

}

}

return false

此例子中,正常逻辑为return true, 不应该在if判断逻辑体内,应该放在if外的主体程序中。以下为更正效果:

username = req.Form.Get("username")

userpass = req.Form.Get("password")

if username == "" {

return false

}

user := LoginIn(username, userpass)

if (user == nil) || (user.Username == "") {

return false

}

return true


5. 使用TCP服务时,需要设计为长连接模式,并实现线程安全的连接池。

6. 在tcpclient和tcpserver之间,封装TCP请求方法,传入interface{},返回inetrface{}

7. else if 过多问题

举例:

if funtionName == "A" {

return funcA

} else if funtionName == "B" {

return funcB

} else if funtionName == "C" {

return funcC

} else if funtionName == "D"

{

return funcD

}

使用map来代替重复的else if:

var functionMap = map[string]interface{} {

"A" == funcA,

"B" == funcB,

"C" == funcC,

"D" == funcD

}

functionMap[functionName].(func())()

8. 使用cookie时,未实现安全的session Token问题。

Session Token可考虑使用 随机数+时间戳+随机值,并设置有效期。

9. 密码存储应哈希加盐,防止彩虹攻击。

通过前端js请求举例:

md5.update(this.userpass)

var userpass = md5.digest('hex') //第一次加密

var salt = "ny1XH"

var md5 = crypto.createHash('md5')

md5.update(userpass+salt)

userpass = md5.digest('hex') //第二次加盐加密

10. 避免重复代码,注意DRY(Don’t Repeat Yourself)和KISS原则(Keep It Simple, Stupid)。

参考:

https://zh.wikipedia.org/wiki/%E4%B8%80%E6%AC%A1%E4%B8%94%E4%BB%85%E4%B8%80%E6%AC%A1

https://zh.wikipedia.org/wiki/KISS%E5%8E%9F%E5%88%99


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:道闻

查看原文:golang编程常见问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1103 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏