#go
#Вперед
Вопрос:
Я создал веб-проект Go с Iris версии 12, и теперь есть файл с именем config.go
, который я могу вывести config.json
с помощью сценария оболочки cat ../config.json
в папке, которая включает config.go
в себя , но обратите на это panic: open ../config.json: no such file or directory
внимание.
Структура папки выглядит следующим образом:
.
├── config
│ └── config.go
├── config.json
├── config.yml
├── controller
├── datasource
├── go.mod
├── go.sum
├── main.go
├── model
│ └── user.go
├── service
├── static
│ ├── css
│ │ └── app.85873a69abe58e3fc37a13d571ef59e2.css
│ ├── favicons
│ │ └── favicon.ico
│ ├── fonts
│ │ └── element-icons.b02bdc1.ttf
│ ├── img
│ │ └── default.jpg
│ ├── index.html
│ └── js
│ ├── 0.6e924665f4f8679a8f0b.js
└── util
PS Я также попробовал ./../config.json
, который доступен в shell и недоступен в Go.
Это config.go
было следующим образом:
package config
import (
"encoding/json"
"os"
)
type AppConfig struct {
AppName string `json:"app_name"` // Project name
Port int `json:"port"` // Server port
StaticPath string `json:"static_path"` // The path of static resources
Mode string `json:"mode"` // Development mode
}
func InitConfig() *AppConfig {
file, err := os.Open("../config.json")
if err != nil {
panic(err.Error())
}
decoder := json.NewDecoder(file)
conf := AppConfig{}
err = decoder.Decode(amp;conf)
if err != nil {
panic(err.Error())
}
return amp;conf
}
Комментарии:
1. Расположение ваших исходных файлов не имеет никакого отношения к относительному расположению любых других файлов во время выполнения.
2. Не связано: не используйте Iris.
3. Уважаемый Flimzy: Итак, как решить эту проблему? Используйте абсолютный путь для решения этой проблемы?
4. Есть много способов решить эту проблему. Распространенным является хранение ваших файлов конфигурации
~/.app-config.yaml
, например.5. Подумайте о том, как другие программы обрабатывают конфигурацию: обычно они ожидают либо фиксированный абсолютный путь (например
/etc/myapp.conf
), либо принимают путь конфигурации из командной строки (напримерmyapp -config ./myapp.conf
).
Ответ №1:
Относительный путь всегда относится к текущему рабочему каталогу запущенного процесса (который не обязательно должен быть каталогом, в котором находится исполняемый файл). Это не имеет никакого отношения к тому, где находится исходный исходный файл.
Для устранения проблемы вы можете попробовать распечатать текущий рабочий каталог непосредственно перед попыткой чтения файла конфигурации:
cwd, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
fmt.Println(cwd)
os.Open()
Затем к этому пути добавляется относительный путь, указанный для.
Если вы запускаете свою программу из корня репозитория, тогда правильный путь к конфигурации будет простым os.Open("config.json")
(если вы не измените рабочий каталог где-нибудь в коде, вызвав os.Chdir()
).
Ответ №2:
Просто удалите ../
из пути к файлу. Если у вас есть файл в корне каталога проекта — просто используйте filename для доступа к нему из любого места в проекте.
func InitConfig() *AppConfig {
file, err := os.Open("config.json")
}
структура проекта:
Результат:
main.go:
package main
import (
"fmt"
"scripts/playground/config"
)
func main() {
cfg := config.InitConfig()
fmt.Printf("% v", cfg)
}