Не похоже, что структуру Person можно неэкспортировать и использовать в качестве возвращаемого значения функции без получения следующей ошибки: cannot refer to unexported name person.person
.
Однако вы можете создать интерфейс Person, который возвращается из New()
fun c, который возвращает неэкспортированную структуру 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()
}
Есть ли конкретная причина, по которой вы хотели бы сделать это таким образом? Общий шаблон, который вы увидите в коде idiomati c 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