[英]Is inheritance a special case of embedded struct in Go?
在Go中, type Txt string
只是type Txt struct {string}
的快捷方式?
您所有问题的答案都是“不!”。
将string
嵌入结构中基本上是一个无用的嵌入示例,因为string
没有可以提升为嵌入类型的方法。
构造type Txt string
定义了一个名为Txt的新类型,基础类型是字符串。 Txt
具有不同的方法集,因为它是不同的类型。 但是由于其基础类型是string
您可以自由地对其进行类型转换。
type T string
不是type S struct { string }
的快捷方式,例如,您不能执行t := T{"foo"}
,只有t := T("foo")
有效,而对于S
则相反。
嵌入与继承绝对没有关系。 这是两件事。 用嵌入模仿继承注定会失败,因为您无法在Go中进行继承。 (这是一个一般性建议,它是非常有用的建议;但是嵌入可以解决某些特定的继承问题。只需忽略继承,您就会更快乐。)
如果两种类型具有共同的数据和方法,则嵌入很有用,在这种情况下,嵌入提供了一些不错的语法糖:代替type T struct { c common; r rest }; t := T{...}; t.common.method()
type T struct { c common; r rest }; t := T{...}; t.common.method()
type T struct { c common; r rest }; t := T{...}; t.common.method()
可以type T struct { common; r rest }; t := T{...}; t.method()
type T struct { common; r rest }; t := T{...}; t.method()
type T struct { common; r rest }; t := T{...}; t.method()
可以节省键入内容,但是基本上是相同的代码。 包测试包含不错的示例。
没有
type Txt string
type StringStruct struct {
string
}
func main() {
var txt Txt = "abc"
fmt.Println(len(txt))
var str string = "abc"
fmt.Println(len(str))
// Uncomment me to get a compiler error!
/* var ss StringStruct = StringStruct{"abc"}
fmt.Println(len(ss)) */
}
您不能在嵌入式的len
上调用len
。 您必须调用len(ss.string)
,因此可以肯定地说type Txt string
不是type Txt struct{ string }
简写。
不, string
是本机类型,例如int
, uint
, float
等。
在内部,这是一小部分。
引用http://blog.golang.org/strings
在Go中,字符串实际上是只读的字节片。
重要的是要预先声明字符串包含任意字节。 不需要保留Unicode文本,UTF-8文本或任何其他预定义格式。 就字符串的内容而言,它完全相当于一个字节片。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.