Last active
March 11, 2020 23:27
-
-
Save mtilson/5a2172202936ae4ddf2c2d89f7ea6527 to your computer and use it in GitHub Desktop.
type assertion
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--== 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