При создании программы командной строки в 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, которая включает эту функцию?
Или отдельный программист должен создать строковый флаг, просканировать его на наличие @ и обработать чтение содержимого файла в себе?

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)
}
Хотя в обращении есть и другие пакеты config / flag, я готов поспорить, что синтаксис
@fileдостаточно необычен и не существует широко используемой реализации. Это, конечно, несложно реализовать, и большинство проектов go предпочли бы простую функцию дополнительной зависимости.