added type assertion example (#567)
* added type assertion example * simplified example
This commit is contained in:
@@ -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)
|
||||
|
||||
}
|
||||
|
@@ -1,2 +1,2 @@
|
||||
d4ea9541521cfee94107ba9331d0dabb1f9f16c1
|
||||
XJASG4MxBQr
|
||||
9a362e2c9aed98013fa9b91af81d6cc373979db6
|
||||
tfsLP7R0dtH
|
||||
|
@@ -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
52
public/interfaces
generated
@@ -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'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>
|
||||
|
Reference in New Issue
Block a user