Home > Article > Backend Development > Why Are Interfaces with Type Constraints Forbidden in Go?
Interface Type Constraints: Understanding and Avoiding "Type Constraints" Errors
In Go, interfaces are powerful constructs that define a set of methods that a type must implement. However, not all interfaces are created equal. Interfaces that contain type constraints impose additional limitations on their usage.
Consider the following type definition:
type Number interface { int | int64 | float64 }
This interface defines a type Number that can represent either int, int64, or float64. However, the Go language specifications explicitly forbid using such interfaces with type elements in any context other than as type parameter constraints.
The compiler will raise the error "interface contains type constraints" when you attempt to use an interface with type elements in other scenarios. For instance, the following code snippet will fail to compile:
type NumberSlice []Number // interface contains type constraints func main() { a := []Number{Number(1), Number(2), Number(3), Number(4)} // cannot use interface Number in conversion }
This error is because Number is an interface with type constraints, and thus it cannot be used as the element type of a slice.
Similar to interfaces with type elements, interfaces that embed comparable or other non-basic interfaces are also non-basic. To avoid these errors, ensure that your interfaces only contain methods or embed basic interfaces.
Examples of Basic and Non-Basic Interfaces:
Basic: Only methods
type A1 interface { GetName() string }
Basic: Methods and embeds basic interface
type B1 interface { A1 SetValue(v int) }
Non-Basic: Embeds comparable
type Message interface { comparable Content() string }
Non-Basic: Has type element (union)
type Number interface { int | int64 | float64 }
Non-Basic: Embeds non-basic interface
type SpecialNumber interface { Number IsSpecial() bool }
Correct Usage of Interfaces with Type Constraints
Interfaces with type constraints can only be used as type parameter constraints. For example:
type Coordinates[T Number] struct { x, y T } func sum[T Number](a, b T) T { return a + b }
In this scenario, the interfaces are used to restrict the allowed types for generic types and functions.
The above is the detailed content of Why Are Interfaces with Type Constraints Forbidden in Go?. For more information, please follow other related articles on the PHP Chinese website!