gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:31:26 25 4
gpt4 key购买 nike

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

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

提前致谢! :)

package models

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

func test() models.Person{
...
}

最佳答案

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

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

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{}
}

然后测试包可以使用该接口(interface)作为其返回值:
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
Go 的有用资源:

https://go.dev/

https://blog.golang.org/

https://golang.org/doc/effective_go.html

https://github.com/golang-standards/project-layout

https://dave.cheney.net/resources-for-new-go-programmers

关于go - 即使结构未导出,您可以使用结构的类型定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62012660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com