Go 中为啥喜欢这样创建变量

2020-08-03 11:52:18 +08:00
 Ansen

经常能看到类似 newRouter 这样的代码

type router struct {
	roots    map[string]*node
	handlers map[string]HandleFunc
}

func newRouter() *router {
	return &router{
		roots:    make(map[string]*node),
		handlers: make(map[string]HandlerFunc),
	}
}

func (r *router) AddRoute(method string, pattern string, handler HandleFunc) 
func (r *router) getRoute(method string, path string) (*node, map[string]string)

然后在其它地方这样调用

r := newRouter()
r.AddRoute()

为啥不直接这样呢?

var r router

代码都能看懂,但是不知道为啥喜欢这样用,或者这样用的好处是啥?

我能想到的是:

  1. 通过指针来保证代码块中访问的一致性
  2. 避免参数复制产生的内存消耗

还有其它的好处吗?

在其它项目中还会看到这样的代码

package gulu
 // ..........

// Result represents a common-used result struct.
type Result struct {
	Code int         `json:"code"` // return code
	Msg  string      `json:"msg"`  // message
	Data interface{} `json:"data"` // data object
}

// NewResult creates a result with Code=0, Msg="", Data=nil.
func (*GuluRet) NewResult() *Result {
	return &Result{
		Code: 0,
		Msg:  "",
		Data: nil,
	}
}
package controller
// .... 
func addSymArticleAction(c *gin.Context) {
	result := gulu.Ret.NewResult()
	defer c.JSON( http.StatusOK, result)

	arg := map[string]interface{}{}
	if err := c.BindJSON(&arg); nil != err {
		result.Code = util.CodeErr
		result.Msg = "parses add article request failed"

		return
	}
    // ....
}
6979 次点击
所在节点    Go 编程语言
43 条回复
Jirajine
2020-08-03 20:54:23 +08:00
@petelin 我没有说构造函数有问题啊,你到底看没看我写的什么。
我说的是变量默认初始化的问题,换一个正常点的语言楼主这种做法编译时就会得到错误“uninitialized variable”,而 go 的做法使其能够通过编译并在运行时崩溃。
scnace
2020-08-04 00:38:15 +08:00
scnace
2020-08-04 00:39:28 +08:00
@scnace 噫 为啥 YouTube 的链接被吃了( <amp-youtube data-videoid="ynoY2xz-F8s" layout="responsive" width="480" height="270"></amp-youtube>

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/695208

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX