golang中匿名组合

golang中匿名组合,第1张

概述包含与匿名组合 1.匿名组合 1.1 匿名组合定义 golang中组合语法,就是在一个类中,引入了另一个类,如 type Logger struct{ } type Work struct{ log Logger } type Work2 struct{ log *Logger } func (Logger)Info 包含与匿名组合 1.匿名组合

1.1 匿名组合定义
golang中组合语法,就是在一个类中,引入了另一个类,如

type Logger struct{    }    type Work struct{        log Logger    }    type Work2 struct{        log *Logger    }    func (Logger)Info(v ...interface{}){    }

如上边代码所示,Work类中定义了一个Logger类型的变量,这种是比较常见的引入方式,姑且在此称之为非匿名组合,那什么是匿名组合呢,如其名,就是在组合的过程中,不给名字呗,如代码所示:

type Logger struct {}type Work struct {    Logger}type Work2 struct {    *Logger}func (Logger) Info(v ...interface{}) {}

上边的代码中,Work类与Work2类均与Logger类匿名组合。两个类唯一不同的是,Work2中组合的是指针类型的Logger类。

1.2 组合对象初始化
非匿名组合初始化方式

func main(){   var wk = Work{log:Logger{}}   var wwk = Work{Logger{}}   //...and so on   var wk2 = Work2{log:new(Logger)}   var wwk2 = Work2{new(Logger)}   //... and so on}

匿名组合初始化

func main(){   var wk = Work{Logger{}}   var wwk = Work{Logger:Logger{}}   //... and so on   var wk2 = Work2{new(Logger)}   var wwk2 = Work2{Logger:&Logger{}}   //... and so on}

上边是匿名组合常见的初始化方式。匿名组合后,被包含类得方法和属性可以直接被使用,即使是私有变量。
注意事项:
1.匿名组合多个类时,不同的类存在相同的方法,会不会冲突?答案是,不同的类中,不同的方法时不会冲突的,但是在调用这个方法时,需要明确是那个类中的方法,如果匿名组合进来的类得方法,与这个类主体中的方法发生冲突,那么默认情况下,会使用主体类中的方法。
2.匿名组合多个类时,类名相同,会不会冲突?答案是,会。就算包名不同,类名相同,也会冲突。
示例代码:

package mainimport(    "bufio")type Reader struct {}type Work4 struct {    Reader    bufio.Reader}

上边代码编译时,会提示Reader重复定义 duplicate fIEld Reader
原因在于,匿名组合中,没有给引入的类命名,所以默认采用了类名作为属性名。如上边wwk2这个对象在调用Logger的Info方法时,可以采用wwk2.Info(“hello”),也可以采用wwk2.Logger.Info(“hello”).
下边附上一段完整的演示代码,注意会报错哦,这段代码包含了上边的duplicate fIEld Reader错误:

package mainimport (    "bufio"    "fmt")type Logger struct {}type Work struct {    Logger}type Work2 struct {    *Logger}type Work3 struct {    log *Logger}type Reader struct {}type Work4 struct {    Reader    bufio.Reader}func (Logger) Info(v ...interface{}) {    fmt.Println(v...)}func main() {    var wk = Work{Logger{}}    wk.Info("hello: Work{Logger{}}")    var wwk = Work{Logger: Logger{}}    wwk.Info("hello: Work{Logger: Logger{}}")    //... and so on    var wk2 = Work2{new(Logger)}    wk2.Info("hello: Work2{new(Logger)}")    var wwk2 = Work2{Logger: &Logger{}}    wwk2.Info("hello: Work2{Logger: &Logger{}}")    wwk2.Logger.Info("hello: wwk2.Logger.Info")    var wk3 = Work3{new(Logger)}    wk3.log.Info("hello: Work3{new(Logger)}")}
总结

以上是内存溢出为你收集整理的golang中匿名组合全部内容,希望文章能够帮你解决golang中匿名组合所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1279871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存