Skip to content

Instantly share code, notes, and snippets.

@tdakkota
Last active October 11, 2021 06:03
Show Gist options
  • Save tdakkota/b07647f9599408147e35c1634b49dfa6 to your computer and use it in GitHub Desktop.
Save tdakkota/b07647f9599408147e35c1634b49dfa6 to your computer and use it in GitHub Desktop.
Compare two generic types in go2go. https://go2goplay.golang.org/p/WWTcvX9lDWH
package main
import (
"bytes"
"fmt"
"io"
)
type wrap[T any] struct{}
func (wrap[T]) t() (zero T) {
return
}
type wrapI[T any] interface {
t() T
}
func SameType[A, B any]() bool {
var a A
switch (interface{})(a).(type) {
case nil:
var w wrap[B]
switch (interface{})(w).(type) {
case wrapI[A]:
default:
return false
}
case B:
default:
return false
}
var b B
switch (interface{})(b).(type) {
case nil:
var w wrap[B]
switch (interface{})(w).(type) {
case wrapI[A]:
default:
return false
}
case A:
default:
return false
}
return true
}
type writer[T any] interface {
Write(T) (int, error)
}
func main() {
fmt.Println(SameType[io.Writer, io.Writer]())
fmt.Println(SameType[*bytes.Buffer, *bytes.Buffer]())
fmt.Println(SameType[writer[int], writer[int]]())
fmt.Println(SameType[writer[io.Writer], writer[io.Writer]]())
fmt.Println()
fmt.Println(SameType[writer[int], writer[string]]())
fmt.Println(SameType[io.Writer, *bytes.Buffer]())
fmt.Println(SameType[io.Writer, bytes.Buffer]())
fmt.Println(SameType[*bytes.Buffer, io.Writer]())
fmt.Println(SameType[bytes.Buffer, io.Writer]())
fmt.Println(SameType[io.Writer, io.Reader]())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment