以下可能会增加比您想要的更多的复杂性,但是,只是为了让您了解所有选项:
Gcfg 的文档声称(我自己实际上并没有这样做)它通过 fmt.Scanner 接口提供了另一种选择。您声明的任何命名类型都可以从 INI 文件中解析,只要它实现 fmt.Scanner。
考虑到这一点,如果您愿意,可以按照以下方式做一些事情:
package main
import (
"fmt"
"strconv"
"strings"
)
type OptionalInt struct {
IsSet bool
Value int
}
//This method definition is rather impromptu and may not be the best way to scan an int
func (optInt *OptionalInt) Scan (state fmt.ScanState, verb rune) (err error) {
var token []byte
var n int
token, err = state.Token(true, nil)
if err==nil {
n, err = strconv.Atoi(string(token))
if err==nil{
optInt.Value = n
optInt.IsSet = true
}
}
return
}
type Config struct {
Port OptionalInt
TimeOut OptionalInt
}
func main(){
//whatever...
}
如果你这样做,一旦你将所有数据从 INI 文件加载到你的 Config 结构中,数据将出现在一组 OptionalInt 字段中。对于每个这样的字段,您将能够检查 IsSet 以及里面的 Value。
如果这种方法对您有吸引力并且您最终尝试了它,也许您可以在这里发表评论,以便我们其他人知道它是如何工作的。