繁体   English   中英

继承是Go中嵌入式结构的一种特殊情况吗?

[英]Is inheritance a special case of embedded struct in Go?

在Go中, type Txt string只是type Txt struct {string}的快捷方式?

您所有问题的答案都是“不!”。

  1. string嵌入结构中基本上是一个无用的嵌入示例,因为string没有可以提升为嵌入类型的方法。

  2. 构造type Txt string定义了一个名为Txt的新类型,基础类型是字符串。 Txt具有不同的方法集,因为它是不同的类型。 但是由于其基础类型是string您可以自由地对其进行类型转换。

  3. type T string不是type S struct { string }的快捷方式,例如,您不能执行t := T{"foo"} ,只有t := T("foo")有效,而对于S则相反。

  4. 嵌入与继承绝对没有关系。 这是两件事。 用嵌入模仿继承注定会失败,因为您无法在Go中进行继承。 (这是一个一般性建议,它是非常有用的建议;但是嵌入可以解决某些特定的继承问题。只需忽略继承,您就会更快乐。)

  5. 如果两种类型具有共同的数据和方法,则嵌入很有用,在这种情况下,嵌入提供了一些不错的语法糖:代替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是本机类型,例如intuintfloat等。

在内部,这是一小部分。

引用http://blog.golang.org/strings

在Go中,字符串实际上是只读的字节片。

重要的是要预先声明字符串包含任意字节。 不需要保留Unicode文本,UTF-8文本或任何其他预定义格式。 就字符串的内容而言,它完全相当于一个字节片。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM