Как Go открывает файлы?

#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)
}