Nilable types
A drawback of Go’s system of zero values is that it introduces ambiguity:
is the value of a field on your target object false
because the web service client set the value to false, or because
the value wasn’t supplied at all and Go defaulted the value to false?
Granitic gets around this problem by providing a set of ‘nilable’ types for bool, string, int64 and float64.
These types all implement the interface types.Nilable
which provides a method IsSet() bool
which can tell you if the value was provided by the client (true) or not (false).
Granitic has deep support for these types and the framework can use them interchangeably in the whole web request processing cycle, including body parsing, path binding, query binding and JSON/XML marshalling. Other parts of Granitic including rule based validation and query management also support these types.
Using nilable types in your target object
Given a target object:
type MyTarget struct {
IntField int
BoolField bool
StringField string
FloatField float
}
Rewrite this as:
type MyTarget struct {
IntField *types.NilableInt64
BoolField *types.NilableBool
StringField *types.NilableString
FloatField *types.NilableFloat64
}
Note that the fields must be declared as pointers to the nilable types.
Using values
Each of the nilable types provides a method to recover the value it contains. The method is named according to the type it returns - e.g. types.NilableBool.Bool()
Next: Validating data
Prev: Capturing data