此接口和私有数据类型模式的概念是什么

问题描述 投票:-1回答:1

我使用了github.com/hooklift/gowsdl/soap,并使用这种模式生成了代码

package funky

import (
    "fmt"
)

type Place struct {
    Text string
}

type RandomFunky interface {
    Buggy(b int)(int)
}

type randomFunky struct {
    place *Place
}

func NewFunky(p *Place) RandomFunky {
    return &randomFunky{
        place: p,
    }
    return nil  
}

func (rf * randomFunky) Buggy(b int)(int) {
    fmt.Println(rf.place.Text)
    return b
}
package main

import (
    "fmt"
    "funky"
)

func main() {
    p := funky.Place{}
    p.Text = "o jee"

    f := funky.NewFunky(&p)
    fmt.Printf("%T\n",f) // type of "*funky.randomFunky"
    // var f *funky.randomFunky !!!  cannot refer to unexported name funky.randomFunky

    f.Buggy(1)  
}

“ f”-我可以这种方式获得这种类型,但是我不能创建这种类型的var!

  • 如果我想将* funky.randomFunky var存储在结构中怎么办?
  • 或将其传递给函数?
  • 这是否意味着每次要调用Buggy方法时,我总是必须重新创建NewFunky?(假设在多个位置和/或接口中调用Buggy的方法更多)
  • 或者我应该修改代码并使* funky.randomFunky公开吗?
  • 否则?
go interface
1个回答
1
投票
因此,想法是任何以小写字母开头的变量/函数/类型/方法都是局部的,而以大写字母开头的变量/函数/方法都是全局的。本地内容只能在同一包内直接使用。

因此,在您的情况下,RandomFunky是具有单个方法Buggy的全局接口,而randomFunky是实现RandomFunky的局部结构,因为它具有具有相同参数的方法Buggy

实际上,NewFunky返回给您包装在接口中的结构。因此,不能在包randomFunky之外使用funky,但可以使用funky.RandomFunky

根据您的情况,您可以只创建这种类型的变量

... var f funky.RandomFunky f = funky.NewFunky(&p) ...

© www.soinside.com 2019 - 2024. All rights reserved.