请教个 Golang Go语言 type 的问题
请教个 Golang Go语言 type 的问题
各位好, 我定义了个这种类型:type ObjectMetadata http.Header
那么为什么 ObjectMetadata 的对象无法使用 Get 方法呢?
谢谢
当你 type A B 的时候,你定义了一个新类型 A,虽然底层类型是 B,当时 A 和 B 是两个不一样的类型,如果要调用 B 的方法,要先把 A 转成 B:B(A).Method()
更多关于请教个 Golang Go语言 type 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
type ObjectMetadata struct { http.Header }
or
type ObjectMetadata = http.Header
type T N 是定义一个新类型,只继承了内存布局,并没有继承方法集
type T struct { N } 是在 T 里嵌入 N 并继承方法集
type T = N 是类型别名,完全等于原类型,只是起了个别名而已,Go1.9 才新加的特性
如果你想继承 B 的方法,应该内嵌 B 类型
谢谢二位细心地讲解,我有所领悟了。
但是目前 组合和类型别名 这两种实现方式稍微有点遗憾呢。
如果使用类型别名的话,我就无法给 ObjectMetadata 这个类型定义一个新方法了。
如果是使用组合嵌入的话,在构造这个 ObjectMetadata 对象的时候,就会把 http.Header 的概念暴露出来了。
请问二位有好的解决方案吗?
你是只想要 Get 方法吗?那定义一个新类型,你再自己定义一个 Get 就行了,type T N 就像#1 说的那种显示类型转换再调用,还可以像 type T struct { h H }定义成 struct 的私有成员就不会暴露出来了。
嗯嗯,有道理,谢谢
你的意思应该就是 type T struct { http.Header}吗 这样 http.Header 不应该暴露的 T 也不会暴露 http.Header 暴露出来的从语义上来说 T 也是应该需要暴露的吧🤔
我的意思是这样的
暴露给用户一个 ObjectMetadata 概念,但是不让他们接触到 ObjectMetadata 实际上是一个 http.Header 类型的。
如果使用 type ObjectMetadata struct { http.Header}这样的话,那么在新建 ObjectMetadata 对象的时候只能这样:<br>om := ObjectMetadata{http.Header{}}<br>
当然,可以给用户提供一个 NewObjectMetadata 的函数来创建 ObjectMetadata 对象,但是一旦这个类型暴露出来,http.Header 也就难免的暴露出来了。
不过这些问题应该不大
当然,我很乐意帮你解答关于Golang中type
的问题。
在Golang中,type
关键字用于声明新的类型或别名现有类型。这是Go语言类型系统的基础之一,它允许你定义更具表达性和安全性的数据结构。
使用type
声明新类型时,你可以创建基于内置类型(如int、string等)的新类型,也可以创建结构体(struct)、接口(interface)、映射(map)、切片(slice)等复合类型。这样做的好处是,虽然新类型在底层与原始类型共享相同的表示,但它们在类型检查时是独立的。这意味着你不能直接将一个新类型变量赋值给一个不同类型的变量,即使它们底层表示相同。
此外,type
还可以用来为现有类型创建别名。这在某些情况下很有用,比如当你想要为某个包外部的类型提供一个更简短的名称,或者当你想要为某个类型添加一些方法而不想修改原始类型定义时。
例如:
type MyInt int
type Person struct {
Name string
Age int
}
type MySlice []int
在上面的例子中,MyInt
是int
的一个新类型,Person
是一个结构体类型,而MySlice
是[]int
的一个别名。
如果你有具体的type
使用场景或疑问,欢迎进一步详细描述,我可以提供更针对性的解答。