为何Go中ipoint类型可用ipoint(1)创建,而Futest结构体需复杂语句?
问题解答
核心差异:两种自定义类型的本质不同
- ipoint 是基本类型的"别名式"自定义类型:
type ipoint int只是给int类型套了个新名字,底层还是int。Go允许用ipoint(1)这种类型转换语法直接创建实例,因为底层值的存储结构完全一致,说白了就是把int值"包装"成新类型而已。 - Futest 是结构体复合类型:
type Futest struct { Name string }是一个全新的聚合类型,它包含独立的字段。结构体属于复合类型,没法用简单的类型转换生成实例,必须用结构体字面量(也就是Futest{...}的形式)来初始化——要么明确指定字段的值,要么空着让Go自动给字段填充零值(比如Futest{}会生成一个Name为空字符串的实例)。
Go语言规范中的对应规则
Go语言规范里明确了这两种类型的初始化要求:
- 对于基于已有类型(尤其是基本类型)定义的新类型,只要值的类型和新类型的底层类型兼容,就能用
T(v)的类型转换表达式创建实例。 - 结构体类型必须通过结构体字面量初始化,字面量支持两种写法:带字段名的键值对形式(
Futest{Name: "test"}),或者按结构体字段定义顺序的简写形式(Futest{"test"},要求字段顺序完全匹配)。
内容的提问来源于stack exchange,提问作者fuyou001
相关产品推荐
相关产品推荐

