use reflection if you really want to use
resource : https://go.dev/blog/laws-of-reflection
interface{} is used to accept any value of x
type any in go in an alias of interface{}
reflect.ValueOf() takes in any argument and return a new reflect.Value type
The reflect.Value type has many methods that let you inspect and modify the value it represents
some methods of reflect.Value
NumField() :
func (v [Value](<https://pkg.go.dev/reflect#Value>)) NumField() [int](<https://pkg.go.dev/builtin#int>)
it return the number of fields in the value which helps us to iterate over the fields
Field(i int):
func (v [Value](<https://pkg.go.dev/reflect#Value>)) Field(i [int](<https://pkg.go.dev/builtin#int>)) [Value](<https://pkg.go.dev/reflect#Value>)
Field returns the i'th field of the struct v. It panics if v's Kind is not Struct or i is out of range.