added type assertion example (#567)

* added type assertion example

* simplified example
This commit is contained in:
kevin-kho
2025-01-06 05:40:39 -08:00
committed by GitHub
parent 58894bd0f4
commit 858d475416
4 changed files with 64 additions and 8 deletions

View File

@@ -51,6 +51,15 @@ func measure(g geometry) {
fmt.Println(g.perim())
}
// Type assertion can be performed to explicitly check the runtime type of the value.
// It allows the access of fields and methods belonging to the specific type.
// See [`switch` example](switch) for an alternative approach to handle type assertion.
func detectCircle(g geometry) {
if c, ok := g.(circle); ok {
fmt.Println(c.radius)
}
}
func main() {
r := rect{width: 3, height: 4}
c := circle{radius: 5}
@@ -61,4 +70,10 @@ func main() {
// these structs as arguments to `measure`.
measure(r)
measure(c)
// `detectCircle` takes structs that satisfy the `geometry` interface
// if the struct is of type `circle`, it prints out the radius.
detectCircle(r) // doesn't print anything.
detectCircle(c)
}

View File

@@ -1,2 +1,2 @@
d4ea9541521cfee94107ba9331d0dabb1f9f16c1
XJASG4MxBQr
9a362e2c9aed98013fa9b91af81d6cc373979db6
tfsLP7R0dtH

View File

@@ -5,6 +5,7 @@ $ go run interfaces.go
{5}
78.53981633974483
31.41592653589793
5
# To learn more about Go's interfaces, check out this
# [great blog post](https://jordanorelli.tumblr.com/post/32665860244/how-to-use-interfaces-in-go).

52
public/interfaces generated
View File

@@ -45,7 +45,7 @@ signatures.</p>
</td>
<td class="code leading">
<a href="https://go.dev/play/p/XJASG4MxBQr"><img title="Run code" src="play.png" class="run" /></a><img title="Copy code" src="clipboard.png" class="copy" />
<a href="https://go.dev/play/p/tfsLP7R0dtH"><img title="Run code" src="play.png" class="run" /></a><img title="Copy code" src="clipboard.png" class="copy" />
<pre class="chroma"><code><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span></span></span></code></pre>
</td>
</tr>
@@ -146,6 +146,23 @@ to work on any <code>geometry</code>.</p>
</td>
</tr>
<tr>
<td class="docs">
<p>Type assertion can be performed to explicitly check the runtime type of the value.
It allows the access of fields and methods belonging to the specific type.
See <a href="switch"><code>switch</code> example</a> for an alternative approach to handle type assertion.</p>
</td>
<td class="code leading">
<pre class="chroma"><code><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">detectCircle</span><span class="p">(</span><span class="nx">g</span> <span class="nx">geometry</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">c</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">g</span><span class="p">.(</span><span class="nx">circle</span><span class="p">);</span> <span class="nx">ok</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">c</span><span class="p">.</span><span class="nx">radius</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre>
</td>
</tr>
<tr>
<td class="docs">
@@ -166,11 +183,33 @@ instances of
these structs as arguments to <code>measure</code>.</p>
</td>
<td class="code">
<td class="code leading">
<pre class="chroma"><code><span class="line"><span class="cl"> <span class="nf">measure</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nf">measure</span><span class="p">(</span><span class="nx">c</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre>
</span></span><span class="line"><span class="cl"> <span class="nf">measure</span><span class="p">(</span><span class="nx">c</span><span class="p">)</span></span></span></code></pre>
</td>
</tr>
<tr>
<td class="docs">
<p><code>detectCircle</code> takes structs that satisfy the <code>geometry</code> interface
if the struct is of type <code>circle</code>, it prints out the radius.</p>
</td>
<td class="code leading">
<pre class="chroma"><code><span class="line"><span class="cl"> <span class="nf">detectCircle</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="c1">// doesn&#39;t print anything.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nf">detectCircle</span><span class="p">(</span><span class="nx">c</span><span class="p">)</span></span></span></code></pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code">
<pre class="chroma"><code><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre>
</td>
</tr>
@@ -190,7 +229,8 @@ these structs as arguments to <code>measure</code>.</p>
</span></span></span><span class="line"><span class="cl"><span class="go">14
</span></span></span><span class="line"><span class="cl"><span class="go">{5}
</span></span></span><span class="line"><span class="cl"><span class="go">78.53981633974483
</span></span></span><span class="line"><span class="cl"><span class="go">31.41592653589793</span></span></span></code></pre>
</span></span></span><span class="line"><span class="cl"><span class="go">31.41592653589793
</span></span></span><span class="line"><span class="cl"><span class="go">5</span></span></span></code></pre>
</td>
</tr>
@@ -221,7 +261,7 @@ these structs as arguments to <code>measure</code>.</p>
</div>
<script>
var codeLines = [];
codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import (\u000A \"fmt\"\u000A \"math\"\u000A)\u000A');codeLines.push('type geometry interface {\u000A area() float64\u000A perim() float64\u000A}\u000A');codeLines.push('type rect struct {\u000A width, height float64\u000A}\u000Atype circle struct {\u000A radius float64\u000A}\u000A');codeLines.push('func (r rect) area() float64 {\u000A return r.width * r.height\u000A}\u000Afunc (r rect) perim() float64 {\u000A return 2*r.width + 2*r.height\u000A}\u000A');codeLines.push('func (c circle) area() float64 {\u000A return math.Pi * c.radius * c.radius\u000A}\u000Afunc (c circle) perim() float64 {\u000A return 2 * math.Pi * c.radius\u000A}\u000A');codeLines.push('func measure(g geometry) {\u000A fmt.Println(g)\u000A fmt.Println(g.area())\u000A fmt.Println(g.perim())\u000A}\u000A');codeLines.push('func main() {\u000A r :\u003D rect{width: 3, height: 4}\u000A c :\u003D circle{radius: 5}\u000A');codeLines.push(' measure(r)\u000A measure(c)\u000A}\u000A');codeLines.push('');codeLines.push('');
codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import (\u000A \"fmt\"\u000A \"math\"\u000A)\u000A');codeLines.push('type geometry interface {\u000A area() float64\u000A perim() float64\u000A}\u000A');codeLines.push('type rect struct {\u000A width, height float64\u000A}\u000Atype circle struct {\u000A radius float64\u000A}\u000A');codeLines.push('func (r rect) area() float64 {\u000A return r.width * r.height\u000A}\u000Afunc (r rect) perim() float64 {\u000A return 2*r.width + 2*r.height\u000A}\u000A');codeLines.push('func (c circle) area() float64 {\u000A return math.Pi * c.radius * c.radius\u000A}\u000Afunc (c circle) perim() float64 {\u000A return 2 * math.Pi * c.radius\u000A}\u000A');codeLines.push('func measure(g geometry) {\u000A fmt.Println(g)\u000A fmt.Println(g.area())\u000A fmt.Println(g.perim())\u000A}\u000A');codeLines.push('func detectCircle(g geometry) {\u000A if c, ok :\u003D g.(circle); ok {\u000A fmt.Println(c.radius)\u000A }\u000A}\u000A');codeLines.push('func main() {\u000A r :\u003D rect{width: 3, height: 4}\u000A c :\u003D circle{radius: 5}\u000A');codeLines.push(' measure(r)\u000A measure(c)\u000A');codeLines.push(' detectCircle(r) // doesn\'t print anything.\u000A detectCircle(c)\u000A');codeLines.push('}\u000A');codeLines.push('');codeLines.push('');
</script>
<script src="site.js" async></script>
</body>