Я могу написать почти все функции в созданном мной модуле, за исключением того, что мне больше всего нужно, — это неопределенное значение... Мне действительно нужно использовать эту функцию
Иерархия каталогов
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 run, привыкайте строить. Вы не можете импортировать неэкспортированные вещи. Пройдите экскурсию по Go, чтобы узнать основы языка. Не используйте несколько модулей для вещей, которые принадлежат одному модулю.
@Volker Это действительно хорошая информация, что мне следует использовать сборку вместо запуска, спасибо. Но если я хочу использовать сборку, я не должен получить ошибку. Как я могу использовать сборку, если не могу сохранить из-за ошибки.
Еще раз: вы должны экспортировать свою функцию и не должны использовать несколько модулей.
@Volker Большое спасибо за совет по экспорту. Если бы вы написали первую букву имени функции с заглавной буквы после экспорта функции, прежде чем дважды опубликовать один и тот же комментарий, мне не пришлось бы тратить 20 минут, спрашивая GPT, что такое, черт возьми, экспорт. Но все равно спасибо.
Это абсолютные основы языка, которые рассматриваются в курсе «Тур по Го», который вам предстоит освоить. Не нужно гуглить, не нужно чепухи с искусственным интеллектом, просто обратитесь к официальной документации на go.dev.
Вы можете попробовать такие команды, как go work sync, go mod tidy и go get "example.com/userinfo". Также лучше преобразовать comExec в ComExec, это может помочь в экспортировании функции. Вы можете обратиться к официальному документу golang о работе с несколькими модулями https://go.dev/doc/tutorial/workspaces
Очевидно, вы можете импортировать другие пакеты в Go. Вы не опубликовали важные части своей конфигурации, например файл go.mod. См., например, «Организация модуля Go».