结构体使用技巧

概述 #

Go 语言中,结构体和它所包含的数据在内存中是以连续块的形式存在的,即使结构体中嵌套有其他的结构体,这在性能上带来了很大的优势。 不像 Java 中的引用类型,一个对象和它里面包含的对象可能会在不同的内存空间中,和 Go 语言中的指针很像。 下面的例子清晰地说明了这些情况:

type Point struct {X, Y int}

type Rect1 struct {Min, Max Point }
type Rect2 struct {Min, Max *Point }

结构体内存布局

强制字面量方式创建结构体 #

在一个结构体中定义一个非导出的零大小字段,编译器将会禁止使用非字面量 (不指明字段名称) 来创建结构体。 备注: 该方法仅针对包外调用,包内调用不受影响

编译失败 #

新建 foo/person.go 文件, 将如下代码写入:

package foo

type Person struct {
	_    [0]int
	Name string
	Age  int
}

新建 main.go 文件, 将如下代码写入:

package main

import "helloworld/foo"

func main() {
	_ = foo.Person{[0]int{}, "bar", 123}
}
$ go run main.go
# 输出如下 
./main.go:6:17: implicit assignment to unexported field _ in foo.Person literal

编译通过 #

package main

import "helloworld/foo"

func main() {
	p := foo.Person{Name: "bar", Age: 123}
	println(p.Name, p.Age)
}
$ go run main.go
# 输出如下 
bar 123

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。

© 蛮荆 | 陕公网安备 61011302001681 号 | 陕ICP备2023004378号-1 | Rendered by Hugo