Как импортировать переменную из одного пакета в другой?

У меня следующая структура папки: 
```
│   err.go
│
├───account
│       errors.go
│
├───auth
│       errors.go
│
├───json
│       errors.go
│
└───registration
        errors.go
```

В файле `err.go` содержится определенный код, а в остальных файлах `errors.go` определены различные ошибки, например, в `account/errors.go`. 

Я хотел бы иметь возможность импортировать переменные (такие как UserNotFound, NotActivatedAccount и другие) из других папок с использованием краткого имени `errs`. Однако в текущем варианте мне удается это сделать только следующим образом: 
```go
accountErrs "moda/internal/tools/errs/account"
```

Можно ли изменить это так, чтобы не использовать полное имя для импорта, а воспользоваться просто `errs`?
  • 15 сентября 2024 г. 13:53
Ответы на вопрос 2
В Go вы можете использовать клички (aliases) при импорте пакетов, чтобы сократить длинные имена. Однако, вы не можете напрямую импортировать несколько пакетов с одинаковым кратким именем. Тем не менее, вы можете создать один пакет, который будет импортировать все необходимые пакеты и затем экспортировать их переменные. Например, вы можете сделать следующее:

1. Создайте новый пакет, например `errs`, где вы будете объединять все свои ошибки из других пакетов.
2. Импортируйте необходимые пакеты внутри нового пакета и экспортируйте их переменные.

Если у вас есть структура папок, как вы описали, создайте пакет `errs` следующим образом:

### Структура файлов
```
│   err.go
│
├───account
│       errors.go
│
├───auth
│       errors.go
│
├───json
│       errors.go
│
├───registration
│       errors.go
│
└───errs
        errors.go
```

### `errs/errors.go`
```go
package errs

import (
    accountErrs "path/to/your/project/account"
    authErrs "path/to/your/project/auth"
    jsonErrs "path/to/your/project/json"
    registrationErrs "path/to/your/project/registration"
)

// Экспортируем нужные ошибки
var (
    UserNotFound          = accountErrs.UserNotFound
    NotActivatedAccount   = accountErrs.NotActivatedAccount
    // Добавьте остальные ошибки по аналогии
    // ...
)
```

### В `err.go`
Теперь вы можете импортировать пакет `errs` и использовать его переменные:

```go
package main

import (
    "path/to/your/project/errs"
)

func main() {
    // Используйте ошибки из пакета errs
    if someCondition {
        fmt.Println(errs.UserNotFound)
    }
}
```

Таким образом, вы сможете совместить ошибки из разных пакетов и использовать их с единым именем `errs`. Главное — убедиться, что все нужные переменные (например, `UserNotFound`, `NotActivatedAccount` и т.д.) экспортированы из соответствующих пакетов.
Go не любит лишних усложнений. У языка такая философия. 
Вы ведь всё равно все ошибки держите в одном пакете, т.е. они всё равно в одной куче с точки зрения программы. Почему бы тогда вместо папок не использовать просто файлы? Т.о. плоская структура с именами файлов вместо папок будет соответствовать вашим нуждам.

err.go
account.go
auth.go
json.go
registation.go
Похожие вопросы