Невозможно импортировать функцию в модуль с рабочей областью Golang

Что мне нужно

Я могу написать почти все функции в созданном мной модуле, за исключением того, что мне больше всего нужно, — это неопределенное значение... Мне действительно нужно использовать эту функцию

Каталог и файлы

Иерархия каталогов

workdir
    main.go
    go.mod
    go.work
    userinfo
        userinfo.go
        go.mod

рабочий каталог/go.mod

module example.com/workdir

go 1.21.5

рабочийкаталог/go.work

go 1.21.5

use (
    .
    ./userinfo
)

рабочий каталог/userinfo/go.mod

module example.com/userinfo

go 1.21.5

Подробное объяснение

Первая идея была проста... Мне надоело каждый раз вводить имя пользователя и пароль в базу данных через ssh, поэтому я хотел сохранить имя пользователя и пароль в конфигурации, чтобы они могли извлекать их всякий раз, когда они мне понадобятся.

Поэтому я написал в каталоге workdir/userinfo кучу функций для шифрования имени пользователя и пароля с помощью алгоритма rsa, установки открытого и закрытого ключей для того и этого и т. д.

И, наконец, я добавил функцию, которая всегда будет вводить мои команды именно так, как они должны быть.

func comExec(dbCommand string) (string, error) {

    var result string
    // Load private key for decryption
    privateKey, err := LoadPrivateKey()
    if err != nil {
        return "", err
    }

    // Read and decrypt credentials
    user, password, err := ReadCredentials(privateKey)
    if err != nil {
        return "", err
    }

    //execute command with db argument
    cmd := exec.Command("myDatabase", dbCommand, "--address=http://localhost.com/db", "--username", user, "--password", password)
    var out bytes.Buffer
    cmd.Stdout = &out

    err = cmd.Run()
    if err != nil {
        return "", err
    }

    result = out.String()
    return result, nil
}

Очевидно, что пока я создавал этот модуль, я мог набрать go run userinfo.go и всё работало отлично.

Поэтому, естественно, я создал main.go в своем workdir и поместил туда эти функции.

import (
    "fmt"
    "strings"

    "example.com/userinfo"
)

func main() {

    var comm := string
    fmt.Scanf("what do you want : %s", &comm)

    result, err := userinfo.comExec(comm)
    if err != nil {
        fmt.Printf("error occurs:", err)
        return
    }

    // Print the fourth part of the command output
    outputParts := strings.Split(result, "\n")
    if len(outputParts) >= 4 {
        fmt.Println(outputParts[3])
    } else {
        fmt.Println("Insufficient output from command")
    }
}

и тут ко мне приходит undefined: userinfo.comExec compiler(UndeclaredImportedName).

Добавлен

Это приходит только в голову, чтобы comExec функционировать. Я использую vscode, очевидно, он имеет автоматическое завершение, и в моем userinfo.go есть множество функций, таких как decrypt, encrypt, generateRSAkeys и т. д. vscode может выполнять эти функции, когда я остановился на userinfo., но не только comExec.

Добавлено 2

https://thewikihow.com/video_RGrEUGCrT4g

Я записал сам, как видите, при сохранении файла импортированный модуль исчез, потому что никакой функции из модуля нет, собственно она именно там!

Очевидно, вы можете импортировать другие пакеты в Go. Вы не опубликовали важные части своей конфигурации, например файл go.mod. См., например, «Организация модуля Go».

eik 27.08.2024 10:41

Здесь все неправильно. Никогда не используйте аргументы имени файла для запуска. Вообще не используйте go run, привыкайте строить. Вы не можете импортировать неэкспортированные вещи. Пройдите экскурсию по Go, чтобы узнать основы языка. Не используйте несколько модулей для вещей, которые принадлежат одному модулю.

Volker 27.08.2024 11:06

@Volker Это действительно хорошая информация, что мне следует использовать сборку вместо запуска, спасибо. Но если я хочу использовать сборку, я не должен получить ошибку. Как я могу использовать сборку, если не могу сохранить из-за ошибки.

E.Laemas Kim 27.08.2024 11:18

Еще раз: вы должны экспортировать свою функцию и не должны использовать несколько модулей.

Volker 27.08.2024 12:34

@Volker Большое спасибо за совет по экспорту. Если бы вы написали первую букву имени функции с заглавной буквы после экспорта функции, прежде чем дважды опубликовать один и тот же комментарий, мне не пришлось бы тратить 20 минут, спрашивая GPT, что такое, черт возьми, экспорт. Но все равно спасибо.

E.Laemas Kim 27.08.2024 13:24

Это абсолютные основы языка, которые рассматриваются в курсе «Тур по Го», который вам предстоит освоить. Не нужно гуглить, не нужно чепухи с искусственным интеллектом, просто обратитесь к официальной документации на go.dev.

Volker 27.08.2024 13:29
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
6
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать такие команды, как go work sync, go mod tidy и go get "example.com/userinfo". Также лучше преобразовать comExec в ComExec, это может помочь в экспортировании функции. Вы можете обратиться к официальному документу golang о работе с несколькими модулями https://go.dev/doc/tutorial/workspaces

Другие вопросы по теме