Перейти: прочитать флаг командной строки из файла

При создании программы командной строки в Go есть ли способ (предоставляемый базовыми библиотеками или широко распространенной практикой) реализовать флаг командной строки, считывающий его содержимое из файла?

Если это не ясно, я думаю о чем-то вроде символа @ в программе curl командной строки. Многие аргументы curl позволяют сделать что-то вроде этого, чтобы прочитать значение флага из файла.

# setting the value 
curl --data-binary '{...}' http://example.com

# setting the value by reading from a file
curl --data-binary @path/to/data.txt http://example.com  

Есть ли у Go код для автоматической реализации таких флагов? Я прочитал официальные документы и не видел ничего очевидного, но у меня все еще есть навыки навигации по этим документам.

Если нет ничего официального, существует ли де-факто стандартная библиотека «лучших флагов», предоставленная кем-то из сообщества go, которая включает эту функцию?

Или отдельный программист должен создать строковый флаг, просканировать его на наличие @ и обработать чтение содержимого файла в себе?

Хотя в обращении есть и другие пакеты config / flag, я готов поспорить, что синтаксис @file достаточно необычен и не существует широко используемой реализации. Это, конечно, несложно реализовать, и большинство проектов go предпочли бы простую функцию дополнительной зависимости.

JimB 05.04.2018 18:38
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
1 176
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

flag.Value позволяет реализовать произвольное поведение флага:

package main

import (
        "flag"
        "fmt"
        "io/ioutil"
        "strings"
)

type T string

// String implements flag.Value
func (t *T) String() string {
        return string(*t)
}

// Set implements flag.Value
func (t *T) Set(maybeFilename string) error {
        if !strings.HasPrefix(maybeFilename, "@") {
                *t = T(maybeFilename)
                return nil
        }

        filename := maybeFilename[1:]
        b, err := ioutil.ReadFile(filename)
        if err != nil {
                return err
        }

        *t = T(string(b))
        return nil
}

func main() {
        var t T
        flag.Var(&t, "data-binary", "(description)")
        flag.Parse()
        fmt.Println(t)
}

Другие вопросы по теме