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

我使用了 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” - 我可以通过这种方式获得这种类型,但我无法创建这种类型的变量!

  • 如果我想将 *funky.randomFunky var 存储在 struct 中怎么办?

  • 或者将其传递给函数?

  • 这是否意味着每次我想调用 Buggy 方法时都必须重新创建 NewFunky ?(假设 Buggy 在多个地方调用和/或接口有更多方法)

  • 或者我应该修改代码并公开 *funky.randomFunky 吗?

  • 要不然?


慕桂英3389331
浏览 70回答 1
1回答

素胚勾勒不出你

所以这个想法是,任何以小写字母开头的变量/函数/类型/方法都是局部的,而以大写字母开头的是全局的。本地的东西只能在同一个包内直接使用。因此,在您的情况下,RandomFunky是一个具有单个方法的全局接口Buggy,而 arandomFunky是一个本地结构,实现,因为它具有具有相同参数的RandomFunky方法。Buggy事实上,NewFunky返回一个封装在接口中的结构。所以不能randomFunky在包外使用funky,但是可以使用funky.RandomFunky。在你的情况下,你可以创建一个这种类型的变量...var f funky.RandomFunkyf = funky.NewFunky(&p)...
打开App,查看更多内容
随时随地看视频慕课网APP