Можно ли использовать определение типа структуры, даже если структура не экспортируется? - PullRequest
0 голосов
/ 26 мая 2020

В настоящее время я использую функцию New () для создания всех моих новых структур Person. Я также использую тип Person в другом пакете в качестве возвращаемого значения другой функции.

Есть ли способ не экспортировать структуру Person, но также иметь возможность использовать только определение типа для struct в других пакетах?

Заранее спасибо! :)

package models

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

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

1 Ответ

3 голосов
/ 26 мая 2020

Не похоже, что структуру 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...