代码之家  ›  专栏  ›  技术社区  ›  Tono Nam

指向同一内存位置的两个不同类型的对象

  •  0
  • Tono Nam  · 技术社区  · 2 年前

    我正在使用一个我正在进口的包。假设我导入的包包含以下内容:

    package foopkg
    
    type Foo struct{
      Name string
      // some othre fields
    }
    

    因为我没有访问该包的权限,希望在上实现我的自定义方法 Foo 我创造了这个:

    package mypkg
    
    type MyFoo foo.Foo
    
    func (x MyFoo) MyExtensionMethodOnFoo() {
     // do something
    }
    
    

    所以现在我在处理类型为 mypkg.MyFoo 这样我就可以调用我的自定义方法。但我经常不得不把它抛给 foopkg.Foo 以便从包foopkg中调用方法。

    无论如何,有没有一种方法可以在不复制整个对象的情况下执行强制转换?这就是我的意思:

    var f1* mypkg.MyFoo = new(mypkg.MyFoo)
    f1.Name = "test1"
    
    // if I want to cast f1 to foopkg.Foo I will have to do this
    var f2 foopkg.Foo = foopkg.Foo(*f1)
    
    // this copies the entire object. To prove this if I do:
    f2.Name = "test2"
    
    fmt.Println(f1.Name) // will print "test1", I want it to print "test2"
    
    // it will be great if I could do this:
    // but this does not compile:
    // var f2* foopkg.Foo = foopkg.Foo(f1)
    
    

    有没有办法让我改变信仰 *f1 这是一种 *mypkg.MyFoo 类型的对象 *foopkg.Foo 都指向同一个内存地址?换句话说,如果我改变 f1.Name 我希望这一变化能得到反思 f2.Name 尽管它们属于不同的类型。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Burak Serdar    2 年前

    使用嵌入:

    type MyFoo struct {
       foo.Foo
    }
    

    这样宣布的时候, MyFoo 将拥有所有的 foo.Foo ,因此您可以:

    x:=MyFoo{}
    x.SomeMethod()
    x.MyExtensionMethod()
    

    以上,如果 x.SomeMethod 是否为声明了一个方法 福。福 ,然后您仍然可以调用它,它将在 福。福 部分 x 这个 MyExtensionMethod 将在 十、 .

    通常,如果使用类型嵌入,嵌入类型的方法也将是派生类型的方法。如果定义一个新类型(不嵌入),新类型将只显式声明该新类型的方法,而不声明任何基类型的方法。