// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. // // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. // Package gvar provides an universal variable type, like runtime generics. package gvar import ( "github.com/gogf/gf/v2/container/gtype" "github.com/gogf/gf/v2/internal/json" ) // Var is an universal variable type implementer. type Var struct { value any // Underlying value. safe bool // Concurrent safe or not. } // New creates and returns a new Var with given `value`. // The optional parameter `safe` specifies whether Var is used in concurrent-safety, // which is false in default. func New(value any, safe ...bool) *Var { if len(safe) > 0 && safe[0] { return &Var{ value: gtype.NewInterface(value), safe: true, } } return &Var{ value: value, } } // MarshalJSON implements the interface MarshalJSON for json.Marshal. func (v *Var) MarshalJSON() ([]byte, error) { return json.Marshal(v.Val()) } // UnmarshalJSON implements the interface UnmarshalJSON for json.Unmarshal. func (v *Var) UnmarshalJSON(b []byte) error { var i any if err := json.UnmarshalUseNumber(b, &i); err != nil { return err } v.Set(i) return nil } // UnmarshalValue is an interface implement which sets any type of value for Var. func (v *Var) UnmarshalValue(value any) error { v.Set(value) return nil }