Home  >  Article  >  Backend Development  >  Use any to instantiate a common interface, struct does not implement it

Use any to instantiate a common interface, struct does not implement it

WBOY
WBOYforward
2024-02-08 22:51:08965browse

Use any to instantiate a common interface, struct does not implement it

In this article, editor Youzi will introduce you to the method of using any to instantiate a universal interface, and explain why struct does not implement it. Generic interfaces are a very useful design pattern that allow us to use a more flexible way when writing code. However, when using common interfaces, we need to pay attention to some details to avoid unnecessary problems. Let's take a look at how to properly instantiate a generic interface using any and understand why struct doesn't implement it.

Question content

Can someone explain why *DataTo does not satisfy ToType[any]?

Try to build a DTOer that copies all the values ​​from one structure to another and sets some explicit values ​​(V in this case)

https://go.dev/play/p/-oobZrw5Ewe

// You can edit this code!
// Click here and start typing.
package main

import "fmt"

type DataFrom struct {
    V1 int
}

type DataTo struct {
    V int
}

func (m *DataTo) SetVal() {
    m.V = 1
    return
}

type ToType[T any] interface {
    SetVal()
    *T
}

type DTO[TFrom any, TTo ToType[any]] struct {
    Get func(from TFrom) TTo
}

func main() {
    dto := &DTO[DataFrom, *DataTo]{
        Get: func(from DataFrom) *DataTo {
            return &DataTo{V: from.V1 + 666}
        },
    }

    vFrom := DataFrom{V1: 1}
    vTo := dto.Get(vFrom)

    fmt.Println(vTo.V)
}

Solution

Because any is a static type.

If you use this to instantiate a generic type like ToType, the generic type will expect exactly any.

Now, certain uses of type parameters may hide this problem, for example:

type Foo[T any] struct {
    Value T
}

Foo[any]{Value: 12} // ok

Normally you can specify any type for any as above, since any is just an alias for the empty interface interface{}, and any type All satisfy the empty interface.

When the type parameter is used for a composite type (e.g. *T), instantiation using any means exactly *any. So you can think of ToType[any] as the same thing:

type ToTypeAny interface {
    SetVal()
    *any
}

Then *DataTo is obviously not *any. More details: Assigning structure pointer to interface pointer

If you declare the struct as follows, it will compile:

type DTO[TFrom any, TTo ToType[DataTo]] struct {
    Get func(from TFrom) TTo
}

Or in a more "generic" but also more detailed way:

type DTO[TFrom any, T any, TTo ToType[T]] struct {
    Get func(from TFrom) TTo
}

&DTO[DataFrom, DataTo, *DataTo]{ ... }

The above is the detailed content of Use any to instantiate a common interface, struct does not implement it. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete