Следующая, вероятно, добавить больше сложности, чем вы хотите, но только так вы в курсе всех вариантов:
требования к документации 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 в вашу конфигурационную структуру, данные появятся в наборе полей OptionalInt. И для каждого такого поля вы сможете проверить IsSet, а также значение внутри.
Если этот подход обращается к вам, и вы в конечном итоге его пытаетесь, возможно, вы можете оставить комментарий здесь, чтобы все остальные знали, как это работает.
В принципе, вы пытаетесь отличить значение по умолчанию от значения? – creack
Есть ли что-нибудь, что мешает вам делать что-то вроде 'if (Config.Server.Host ==" "&& Config.Server.Port == 0)'? Я не думаю, что вам нужно * использовать рефлексию, но если вы это сделаете, посмотрите http://golang.org/pkg/reflect/#DeepEqual. – Intermernet
Я могу сделать вышеприведенный оператор if, однако я думаю, что с большим конфигурационным файлом это выйдет из-под контроля. Мой друг придумал http://play.golang.org/p/9g2OMLdgYq как хороший способ проникнуть в глубокие структуры (которые я мог бы использовать для сравнения тех, которые устанавливаются по сравнению с теми, которые находятся в структуре cfg) –