Using optional function to allow user optionally set attributes
package main import ( "bytes" "encoding/json" "fmt" ) // ExampleOptFunc sets Example's optional attribute type ExampleOptFunc func(*Example) // WithAttr1 sets Example's OptionalAttr1 as true func WithAttr1() ExampleOptFunc { return func(e *Example) { e.OptionalAttr1 = true } } // WithAttr2 sets Example's OptionalAttr2 as i func WithAttr2(i int) ExampleOptFunc { return func(e *Example) { e.OptionalAttr2 = i } } // WithAttr3 sets Example's OptionalAttr3 as s func WithAttr3(s string) ExampleOptFunc { return func(e *Example) { e.OptionalAttr3 = s } } // Example is an example struct with some optional attributes type Example struct { Name string `json:"name"` OptionalAttr1 bool `json:"optional_attr1"` OptionalAttr2 int `json:"optional_attr2"` OptionalAttr3 string `json:"optional_attr3"` } // NewExample creates Example ptr // requires name func NewExample(name string, opts ...ExampleOptFunc) *Example { e := &Example{ Name: name, } for _, opt := range opts { opt(e) } return e } // String returns json-encoded string func (e *Example) String() string { var b bytes.Buffer enc := json.NewEncoder(&b) enc.SetIndent("", " ") _ = enc.Encode(e) return b.String() } func main() { e := NewExample("example", WithAttr1(), WithAttr2(100), WithAttr3("testing")) fmt.Println(e) // { // "name": "example", // "optional_attr1": true, // "optional_attr2": 100, // "optional_attr3": "testing" // } }
Top comments (0)