Skip to content

Instantly share code, notes, and snippets.

@mtilson
Last active March 11, 2020 23:27
Show Gist options
  • Save mtilson/5a2172202936ae4ddf2c2d89f7ea6527 to your computer and use it in GitHub Desktop.
Save mtilson/5a2172202936ae4ddf2c2d89f7ea6527 to your computer and use it in GitHub Desktop.
type assertion
package main
import "fmt"
type ConcreteTypeTypeReceiver struct {n int}
func (c ConcreteTypeTypeReceiver) someMethod() int {return c.n}
// declaration above SUPPORTs the following types
// 1. `ConcreteTypeTypeReceiver` - with methods (according to case C2)
// 1. `someMethod()`
// 2. `*ConcreteTypeTypeReceiver` - with methods (according to case F2)
// 1. `someMethod()`
type ConcreteTypePtrReceiver struct {n int}
func (c *ConcreteTypePtrReceiver) someMethod() int {return c.n}
// declaration above DOS NOT SUPPORT the following types
// 1. `ConcreteTypePtrReceiver` - with methods (according to case I2)
// 1. `someMethod()`
// declaration above SUPPORTs the following types
// 1. `*ConcreteTypePtrReceiver` - with methods (according to case L2)
// 1. `someMethod()`
type InterfaceType interface {
someMethod() int
}
func main() {
fmt.Printf("--== Concrete Type with Type Method Receiver; Interface Dynamic Value is Value ==--\n")
{ var x interface{} = ConcreteTypeTypeReceiver{1}; fmt.Printf("A1: %#v %T; ", x, x); var y ConcreteTypeTypeReceiver = x.(ConcreteTypeTypeReceiver); fmt.Printf("%#v %T\n", y, y) } // A1: {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver
{ var x InterfaceType = ConcreteTypeTypeReceiver{1}; fmt.Printf("A2: %#v %T; ", x, x); var y ConcreteTypeTypeReceiver = x.(ConcreteTypeTypeReceiver); fmt.Printf("%#v %T\n", y, y) } // A2: {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver
// { var x interface{} = ConcreteTypeTypeReceiver{1}; fmt.Printf("B1: %#v %T; ", x, x); var y *ConcreteTypeTypeReceiver = x.(*ConcreteTypeTypeReceiver); fmt.Printf("%#v %T\n", y, y) } // B1: {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; panic: interface conversion: interface {} is main.ConcreteTypeTypeReceiver, not *main.ConcreteTypeTypeReceiver
// { var x InterfaceType = ConcreteTypeTypeReceiver{1}; fmt.Printf("B2: %#v %T; ", x, x); var y *ConcreteTypeTypeReceiver = x.(*ConcreteTypeTypeReceiver); fmt.Printf("%#v %T\n", y, y) } // B2: {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; panic: interface conversion: main.InterfaceType is main.ConcreteTypeTypeReceiver, not *main.ConcreteTypeTypeReceiver
{ var x interface{} = ConcreteTypeTypeReceiver{1}; fmt.Printf("C1: %#v %T; ", x, x); var y InterfaceType = x.(InterfaceType); fmt.Printf("%#v %T\n", y, y) } // C1: {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver
{ var x InterfaceType = ConcreteTypeTypeReceiver{1}; fmt.Printf("C2: %#v %T; ", x, x); var y InterfaceType = x.(InterfaceType); fmt.Printf("%#v %T\n", y, y) } // C2: {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; {1} main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver
fmt.Println()
fmt.Printf("--== Concrete Type with Type Method Receiver; Interface Dynamic Value is Pointer ==--\n")
// { var x interface{} = &ConcreteTypeTypeReceiver{1}; fmt.Printf("D1: %#v %T; ", x, x); var y ConcreteTypeTypeReceiver = x.(ConcreteTypeTypeReceiver); fmt.Printf("%#v %T\n", y, y) } // D1: &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; panic: interface conversion: interface {} is *main.ConcreteTypeTypeReceiver, not main.ConcreteTypeTypeReceiver
// { var x InterfaceType = &ConcreteTypeTypeReceiver{1}; fmt.Printf("D2: %#v %T; ", x, x); var y ConcreteTypeTypeReceiver = x.(ConcreteTypeTypeReceiver); fmt.Printf("%#v %T\n", y, y) } // D2: &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; panic: interface conversion: main.InterfaceType is *main.ConcreteTypeTypeReceiver, not main.ConcreteTypeTypeReceiver
{ var x interface{} = &ConcreteTypeTypeReceiver{1}; fmt.Printf("E1: %#v %T; ", x, x); var y *ConcreteTypeTypeReceiver = x.(*ConcreteTypeTypeReceiver); fmt.Printf("%#v %T\n", y, y) } // E1: &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver
{ var x InterfaceType = &ConcreteTypeTypeReceiver{1}; fmt.Printf("E2: %#v %T; ", x, x); var y *ConcreteTypeTypeReceiver = x.(*ConcreteTypeTypeReceiver); fmt.Printf("%#v %T\n", y, y) } // E2: &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver
{ var x interface{} = &ConcreteTypeTypeReceiver{1}; fmt.Printf("F1: %#v %T; ", x, x); var y InterfaceType = x.(InterfaceType); fmt.Printf("%#v %T\n", y, y) } // F1: &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver
{ var x InterfaceType = &ConcreteTypeTypeReceiver{1}; fmt.Printf("F2: %#v %T; ", x, x); var y InterfaceType = x.(InterfaceType); fmt.Printf("%#v %T\n", y, y) } // F2: &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; &{1} &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver
fmt.Println()
fmt.Printf("--== Concrete Type with Pointer Method Receiver; Interface Dynamic Value is Value ==--\n")
{ var x interface{} = ConcreteTypePtrReceiver{1}; fmt.Printf("G1: %#v %T; ", x, x); var y ConcreteTypePtrReceiver = x.(ConcreteTypePtrReceiver); fmt.Printf("%#v %T\n", y, y) } // G1: {1} main.ConcreteTypePtrReceiver{n:1} main.ConcreteTypePtrReceiver; {1} main.ConcreteTypePtrReceiver{n:1} main.ConcreteTypePtrReceiver
// { var x InterfaceType = ConcreteTypePtrReceiver{1}; fmt.Printf("G2: %#v %T; ", x, x); var y ConcreteTypePtrReceiver = x.(ConcreteTypePtrReceiver); fmt.Printf("%#v %T\n", y, y) } // compile error: 8: cannot use ConcreteTypePtrReceiver literal (type ConcreteTypePtrReceiver) as type InterfaceType in assignment: ConcreteTypePtrReceiver does not implement InterfaceType (someMethod method has pointer receiver) // 131: impossible type assertion: ConcreteTypePtrReceiver does not implement InterfaceType (someMethod method has pointer receiver)
// { var x interface{} = ConcreteTypePtrReceiver{1}; fmt.Printf("H1: %#v %T; ", x, x); var y *ConcreteTypePtrReceiver = x.(*ConcreteTypePtrReceiver); fmt.Printf("%#v %T\n", y, y) } // H1: {1} main.ConcreteTypePtrReceiver{n:1} main.ConcreteTypePtrReceiver; panic: interface conversion: interface {} is main.ConcreteTypePtrReceiver, not *main.ConcreteTypePtrReceiver
// { var x InterfaceType = ConcreteTypePtrReceiver{1}; fmt.Printf("H2: %#v %T; ", x, x); var y *ConcreteTypePtrReceiver = x.(*ConcreteTypePtrReceiver); fmt.Printf("%#v %T\n", y, y) } // compile error: 8: cannot use ConcreteTypePtrReceiver literal (type ConcreteTypePtrReceiver) as type InterfaceType in assignment: ConcreteTypePtrReceiver does not implement InterfaceType (someMethod method has pointer receiver)
// { var x interface{} = ConcreteTypePtrReceiver{1}; fmt.Printf("I1: %#v %T; ", x, x); var y InterfaceType = x.(InterfaceType); fmt.Printf("%#v %T\n", y, y) } // I1: {1} main.ConcreteTypePtrReceiver{n:1} main.ConcreteTypePtrReceiver; panic: interface conversion: main.ConcreteTypePtrReceiver is not main.InterfaceType: missing method someMethod
// { var x InterfaceType = ConcreteTypePtrReceiver{1}; fmt.Printf("I2: %#v %T; ", x, x); var y InterfaceType = x.(InterfaceType); fmt.Printf("%#v %T\n", y, y) } // compile error: 8: cannot use ConcreteTypePtrReceiver literal (type ConcreteTypePtrReceiver) as type InterfaceType in assignment: ConcreteTypePtrReceiver does not implement InterfaceType (someMethod method has pointer receiver)
fmt.Println()
fmt.Printf("--== Concrete Type with Pointer Method Receiver; Interface Dynamic Value is Pointer ==--\n")
// { var x interface{} = &ConcreteTypePtrReceiver{1}; fmt.Printf("J1: %#v %T; ", x, x); var y ConcreteTypePtrReceiver = x.(ConcreteTypePtrReceiver); fmt.Printf("%#v %T\n", y, y) } // J1: &{1} &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver; panic: interface conversion: interface {} is *main.ConcreteTypePtrReceiver, not main.ConcreteTypePtrReceiver
// { var x InterfaceType = &ConcreteTypePtrReceiver{1}; fmt.Printf("J2: %#v %T; ", x, x); var y ConcreteTypePtrReceiver = x.(ConcreteTypePtrReceiver); fmt.Printf("%#v %T\n", y, y) } // compile error: 131: impossible type assertion: ConcreteTypePtrReceiver does not implement InterfaceType (someMethod method has pointer receiver)
{ var x interface{} = &ConcreteTypePtrReceiver{1}; fmt.Printf("K1: %#v %T; ", x, x); var y *ConcreteTypePtrReceiver = x.(*ConcreteTypePtrReceiver); fmt.Printf("%#v %T\n", y, y) } // K1: &{1} &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver; &{1} &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver
{ var x InterfaceType = &ConcreteTypePtrReceiver{1}; fmt.Printf("K2: %#v %T; ", x, x); var y *ConcreteTypePtrReceiver = x.(*ConcreteTypePtrReceiver); fmt.Printf("%#v %T\n", y, y) } // K2: &{1} &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver; &{1} &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver
{ var x interface{} = &ConcreteTypePtrReceiver{1}; fmt.Printf("L1: %#v %T; ", x, x); var y InterfaceType = x.(InterfaceType); fmt.Printf("%#v %T\n", y, y) } // L1: &{1} &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver; &{1} &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver
{ var x InterfaceType = &ConcreteTypePtrReceiver{1}; fmt.Printf("L2: %#v %T; ", x, x); var y InterfaceType = x.(InterfaceType); fmt.Printf("%#v %T\n", y, y) } // L2: &{1} &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver; &{1} &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver
}
--== Concrete Type with Type Method Receiver; Interface Dynamic Value is Value ==--
A1: main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver
A2: main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver
C1: main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver
C2: main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver; main.ConcreteTypeTypeReceiver{n:1} main.ConcreteTypeTypeReceiver
--== Concrete Type with Type Method Receiver; Interface Dynamic Value is Pointer ==--
E1: &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver
E2: &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver
F1: &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver
F2: &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver; &main.ConcreteTypeTypeReceiver{n:1} *main.ConcreteTypeTypeReceiver
--== Concrete Type with Pointer Method Receiver; Interface Dynamic Value is Value ==--
G1: main.ConcreteTypePtrReceiver{n:1} main.ConcreteTypePtrReceiver; main.ConcreteTypePtrReceiver{n:1} main.ConcreteTypePtrReceiver
--== Concrete Type with Pointer Method Receiver; Interface Dynamic Value is Pointer ==--
K1: &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver; &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver
K2: &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver; &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver
L1: &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver; &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver
L2: &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver; &main.ConcreteTypePtrReceiver{n:1} *main.ConcreteTypePtrReceiver
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment