请教个 Golang Go语言 type 的问题

发布于 1周前 作者 wuwangju 来自 Go语言

请教个 Golang Go语言 type 的问题

各位好, 我定义了个这种类型:type ObjectMetadata http.Header

那么为什么 ObjectMetadata 的对象无法使用 Get 方法呢?

谢谢

9 回复

当你 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

在上面的例子中,MyIntint的一个新类型,Person是一个结构体类型,而MySlice[]int的一个别名。

如果你有具体的type使用场景或疑问,欢迎进一步详细描述,我可以提供更针对性的解答。

回到顶部