I don't think so. There is no way to decompose structs as part of constraints, so you can't generalize over them easily. There is also no way to generalize over an arbitrary number of types, which would be necessary to write a signature of `ReturnFunc`.
On Sun, Oct 3, 2021 at 5:41 PM mi...@ubo.ro <mi...@ubo.ro> wrote: > I have developed a library that depends very much on reflect package. It > caches a specific type and return a function that encodes(does something > with) with that kind /type of data. Think of defining database schema using > types and generating functions to validate/update/insert data. > > I reduced it to a basic example below. Can the generics feature from Go > help me make it any safer? Ideally I would like to make the program below* > not to compile *due the errors of invalid params passed to *PrintT* > instead to throw dynamically at runtime. > package main > > import ( > "errors" > "fmt" > "reflect" > ) > > type T struct { > F1 string > F2 int > } > > type T2 struct { > F1 float32 > F2 bool > } > > var PrintT = Function(T{}) > > func main() { > > if err := PrintT("one", 1); err != nil { > fmt.Printf("err %v", err) > } > if err := PrintT("one", 1, "another"); err != nil { > fmt.Printf("err %v", err) > } > if err := PrintT("one", "one"); err != nil { > fmt.Printf("err %v", err) > } > > } > > type ReturnFunc func(params ...interface{}) error > > func Function(v interface{}) ReturnFunc { > > var paramTypes []reflect.Type > tv := reflect.TypeOf(v) > for i := 0; i < tv.NumField(); i++ { > paramTypes = append(paramTypes, tv.Field(i).Type) > } > fn := func(param ...interface{}) error { > // validate input > if len(param) != len(paramTypes) { > return errors.New("invalid number of params passed") > } > for k, v := range param { > if reflect.TypeOf(v) != paramTypes[k] { > return errors.New("invalid type passed") > } > } > // do something with the params > fmt.Println(param...) > return nil > } > return fn > } > > > https://go2goplay.golang.org/p/1MJynmFhq6B > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/2bc1a657-c4e0-42a1-82b0-8bc605c429a2n%40googlegroups.com > <https://groups.google.com/d/msgid/golang-nuts/2bc1a657-c4e0-42a1-82b0-8bc605c429a2n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CAEkBMfEimpJ_5BiPRSAcOds8qEp9yCJW1FJTqfpKRG7cHEQdSA%40mail.gmail.com.