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

Go 即使结构未导出,也可以使用结构的类型定义吗?,go,Go,我目前正在使用新函数创建我的所有新Person结构。我还在另一个包中使用Person类型作为另一个函数的返回值 有没有一种方法可以使Person结构不导出,但也能够在其他包中仅使用该结构的类型定义 提前谢谢!: package models type Person struct { Username string Email string } func New() Person{ return Person{} } 在不接收以下错误的情况下,Person结构似乎

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

有没有一种方法可以使Person结构不导出,但也能够在其他包中仅使用该结构的类型定义

提前谢谢!:

package models

type Person struct {
    Username string
    Email    string
}
func New() Person{
    return Person{}
}

在不接收以下错误的情况下,Person结构似乎不能被未报告并用作函数的返回值:不能引用未报告的名称Person.Person

但是,您可以创建从新func返回的Person接口,该函数返回实现该接口的未报告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返回未报告的类型Person.Person,这可能会让人讨厌

围棋的有用资源:


你不想公开用户名和电子邮件吗?想通过包外的getter/setter访问它们吗?对不起,我的问题可能措辞不当,但我的目标是只有一种通过新函数创建结构的方法,而不是仅仅根据结构定义直接创建结构。哦,我的想法是,从技术上讲,有些人可以直接使用结构定义而不是使用新函数创建新结构。因此,这就是为什么我只需要一种创建结构的方法。我不久前才开始学习围棋,但非常感谢你没问题,@SamIAm。请让我知道,如果你有任何问题或需要在我的回答任何澄清。我还在底部添加了一个参考资料部分,其中有一些指向一些很棒的围棋内容的链接。我希望你喜欢学围棋。这是一个非常愉快和强大的语言使用。是的,当然!非常感谢!
// 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")
    }
}