Go Type Assertions: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
No edit summary
Line 16: Line 16:
var i SomeInterface
var i SomeInterface


v, isType := i.(TypeName)
v, isTypeName := i.(TypeName)
</syntaxhighlight>
</syntaxhighlight>



Revision as of 17:04, 12 January 2024

External

Internal

Overview

An interface hides the differences between the types implementing it and emphasizes the commonality.

However, there are times you may want to know what exact concrete type exists behind the interface.

Type assertions can be used for type disambiguation:

var i SomeInterface

v, isTypeName := i.(TypeName)

Usage example:

type SomeInterface interface {
  MethodA()
}

type TypeA struct {
  s string
}

func (v *TypeA) MethodA() {
  fmt.Println("TypeA.MethodA()")
}

type TypeB struct {
  s string
}

func (v *TypeB) MethodA() {
  fmt.Println("TypeB.MethodA()")
}

...

var i SomeInterface
i = &TypeA{"A"}
b := &TypeB{"B"}

a, isTypeA := i.(*TypeA)
fmt.Printf("%v, %t\n", a, isTypeA) // will print {A}, true
b, isTypeB := i.(*TypeB)
fmt.Printf("%v, %t\n", b, isTypeB) // will print <nil>, false

Type Assertion

Type Switch

Type assertion with switch:

var i SomeInterface
i = TypeA{"A"}

switch v := i.(type) {
  case TypeA:
	fmt.Printf("TypeA: %v\n", v)
  case TypeB:
	fmt.Printf("TypeB: %v\n", v)
}