即使结构未导出,您可以使用结构的类型定义吗?

我目前正在使用 New() 函数来创建我所有的新 Person 结构。我还在另一个包中使用 Person 类型作为另一个函数的返回值。


有没有办法让 Person 结构不被导出,但也能够在其他包中只使用结构的类型定义?


提前致谢!:)


package models


type Person struct {

    Username string

    Email    string

}

func New() Person{

    return Person{}

}

package test


func test() models.Person{

    ...

}


慕婉清6462132
浏览 116回答 1
1回答

慕莱坞森

似乎 Person 结构可以不导出并用作函数的返回值而不会收到以下错误:cannot refer to unexported name person.person.但是,您可以创建一个从New()函数返回的 Person 接口,该函数返回实现该接口的未导出人员结构:package modelstype Person interface {    GetUsername() string    GetEmail() string}type person struct {    Username string    Email    string}func (p person) GetUsername() string {    return p.Username}func (p person) GetEmail() string {    return p.Email}func New() Person{    return person{}}然后测试包可以使用该接口作为其返回值:package testfunc test() person.Person {    return person.New()}你有什么特别的理由想这样做吗?您将在惯用的 Go 代码中看到的常见模式如下所示:// person.gopackage person// Person ...type Person struct {    Username string    Email    string}// New ...func New() Person {    return Person{        Username: "username",        Email:    "email",    }}// person_test.gopackage personimport "testing"func TestNew(t *testing.T) {    p := New()    if p.Username != "something" {        t.Error("error")    }}Person 结构及其测试包含在同一个包中,并且 Person 是一个导出的结构,它避免了以下 go-lint 警告:exported func New returns unexported type person.person, which can be annoying to use
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go