Невозможно импортировать функцию в модуль с рабочей областью 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 предоставляет возможность создавать собственные библиотеки и пакеты для повторного использования.


50
1

Ответ:

Решено

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