为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕婉清6462132 2022-06-06 15:47:18
我目前正在使用 New() 函数来创建我所有的新 Person 结构。我还在另一个包中使用 Person 类型作为另一个函数的返回值。有没有办法让 Person 结构不被导出,但也能够在其他包中只使用结构的类型定义?提前致谢!:)package modelstype Person struct {    Username string    Email    string}func New() Person{    return Person{}}package testfunc test() models.Person{    ...}
查看完整描述

1 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

似乎 Person 结构可以不导出并用作函数的返回值而不会收到以下错误:cannot refer to unexported name person.person.


但是,您可以创建一个从New()函数返回的 Person 接口,该函数返回实现该接口的未导出人员结构:


package models


type 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 test


func test() person.Person {

    return person.New()

}

你有什么特别的理由想这样做吗?您将在惯用的 Go 代码中看到的常见模式如下所示:


// person.go

package person


// Person ...

type Person struct {

    Username string

    Email    string

}


// New ...

func New() Person {

    return Person{

        Username: "username",

        Email:    "email",

    }

}



// person_test.go

package person


import "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


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号