Я могу написать почти все функции в созданном мной модуле, за исключением того, что мне больше всего нужно, — это неопределенное значение... Мне действительно нужно использовать эту функцию
Иерархия каталогов
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
.
https://thewikihow.com/video_RGrEUGCrT4g
Я записал сам, как видите, при сохранении файла импортированный модуль исчез, потому что никакой функции из модуля нет, собственно она именно там!
🤔 А знаете ли вы, что...
Go предоставляет возможность создавать собственные библиотеки и пакеты для повторного использования.
Вы можете попробовать такие команды, как go work sync, go mod tidy и go get "example.com/userinfo". Также лучше преобразовать comExec в ComExec, это может помочь в экспортировании функции. Вы можете обратиться к официальному документу golang о работе с несколькими модулями https://go.dev/doc/tutorial/workspaces