golang struct 定义类型用哪种方法?

type Vertex struct {
    X, Y int
}

你们用哪种方式定义?

  • var p = Vertex{}

  • var q = &Vertex{}

  • var t Vertex

另外: Vertex 和 *Vertex 这两种类型哪个用的多

阅读 3.8k
3 个回答

如果的这个对象的作用域只是当前函数,那 Vertex*Vertex 都一样,因为 *Vertex 不会发生逃逸,这个指针也会被分配在栈上。

另外一种情况就是如果这个结构体的对象会作为函数的返回值返回,如果使用了 *Vertex 这样的方式,那就有可能发生逃逸,那编译器就会将它分配在堆上,其实这是个结构体本身很简单,占用不了多大内存 ,完全可以使用Vertex,因为小对象值拷贝的代价远小于在堆上分配的代价

如果struct里只是原始类型,var v Type就是全部默认值,如果Type里有其他类型,例如map,那么你不写个构造函数,或者不用v1 := Type{make(subType),...},就不能用这个变量。

除此之外,你的例子里p, q, t三个的含义都不一样,第一个是值,第二个是指针,第三个是默认值或者不能用的变量。(未初始化)

不同的场景使用不同的定义方式, 不能拘泥于这种形式, 还有个人喜好
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题