教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go语言的静态类型和动态类型示例

Go语言的静态类型和动态类型示例

发布时间:2021-12-18   编辑:jiaochengji.com
教程集为您提供Go语言的静态类型和动态类型示例等资源,欢迎您收藏本站,我们将为您提供最新的Go语言的静态类型和动态类型示例资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

先来看个简单的go程序:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> TaskIntf <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Task <span class="token keyword">struct</span> <span class="token punctuation">{</span> TaskId <span class="token builtin">string</span> X <span class="token builtin">int</span> Y <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Task<span class="token punctuation">)</span><span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> t TaskIntf <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>Task<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%T\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> t<span class="token punctuation">.</span><span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

结果:

<pre><code class="lang-go hljs"><span class="token operator">*</span>main<span class="token punctuation">.</span>Task <span class="token operator">&</span><span class="token punctuation">{</span>TaskId<span class="token punctuation">:</span> X<span class="token punctuation">:</span><span class="token number">0</span> Y<span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">}</span> <span class="token operator">&</span><span class="token punctuation">{</span>TaskId<span class="token punctuation">:</span> X<span class="token punctuation">:</span><span class="token number">0</span> Y<span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">}</span> </code></pre>

再看:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> TaskIntf <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Task <span class="token keyword">struct</span> <span class="token punctuation">{</span> TaskId <span class="token builtin">string</span> X <span class="token builtin">int</span> Y <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Task<span class="token punctuation">)</span><span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> t TaskIntf <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>Task<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%T\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> t<span class="token punctuation">.</span>X <span class="token operator">=</span> <span class="token number">1</span> t<span class="token punctuation">.</span><span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

结果出现编译错误:

<pre><code class="lang-go hljs">t<span class="token punctuation">.</span>X undefined <span class="token punctuation">(</span><span class="token keyword">type</span> TaskIntf has no field or method X<span class="token punctuation">)</span> </code></pre>

注意到, 对于t而言,静态类型是TaskIntf, 动态类型(运行时)是Task. 而在t.X = 1时,编译器会进行静态检查, 故编译错误。 那怎么办呢? 提供三种方式:

第一是使用断言:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> TaskIntf <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Task <span class="token keyword">struct</span> <span class="token punctuation">{</span> TaskId <span class="token builtin">string</span> X <span class="token builtin">int</span> Y <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Task<span class="token punctuation">)</span><span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> t TaskIntf <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>Task<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%T\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> t<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span>Task<span class="token punctuation">)</span><span class="token punctuation">.</span>X <span class="token operator">=</span> <span class="token number">1</span> t<span class="token punctuation">.</span><span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

结果:

<pre><code class="lang-go hljs"><span class="token operator">*</span>main<span class="token punctuation">.</span>Task <span class="token operator">&</span><span class="token punctuation">{</span>TaskId<span class="token punctuation">:</span> X<span class="token punctuation">:</span><span class="token number">1</span> Y<span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">}</span> <span class="token operator">&</span><span class="token punctuation">{</span>TaskId<span class="token punctuation">:</span> X<span class="token punctuation">:</span><span class="token number">1</span> Y<span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">}</span> </code></pre>

也可以这么搞:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"encoding/json"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> TaskIntf <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Task <span class="token keyword">struct</span> <span class="token punctuation">{</span> TaskId <span class="token builtin">string</span> X <span class="token builtin">int</span> Y <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Task<span class="token punctuation">)</span><span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> t TaskIntf <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>Task<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%T\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> str_json <span class="token operator">:=</span> <span class="token string">`{"taskid":"xxxxxx", "x":1, "y":2}`</span> json<span class="token punctuation">.</span><span class="token function">Unmarshal</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token function">byte</span><span class="token punctuation">(</span>str_json<span class="token punctuation">)</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> t<span class="token punctuation">.</span><span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

结果:

<pre><code class="lang-go hljs"><span class="token operator">*</span>main<span class="token punctuation">.</span>Task <span class="token operator">&</span><span class="token punctuation">{</span>TaskId<span class="token punctuation">:</span>xxxxxx X<span class="token punctuation">:</span><span class="token number">1</span> Y<span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">}</span> <span class="token operator">&</span><span class="token punctuation">{</span>TaskId<span class="token punctuation">:</span>xxxxxx X<span class="token punctuation">:</span><span class="token number">1</span> Y<span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">}</span> </code></pre>

还可以这么搞:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> TaskIntf <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token function">GetTask</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span>Task <span class="token punctuation">}</span> <span class="token keyword">type</span> Task <span class="token keyword">struct</span> <span class="token punctuation">{</span> TaskId <span class="token builtin">string</span> X <span class="token builtin">int</span> Y <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Task<span class="token punctuation">)</span> <span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Task<span class="token punctuation">)</span> <span class="token function">GetTask</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span>Task <span class="token punctuation">{</span> <span class="token keyword">return</span> p <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> t TaskIntf <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>Task<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%T\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> t<span class="token punctuation">.</span><span class="token function">GetTask</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>TaskId <span class="token operator">=</span> <span class="token string">"xxxxxx"</span> t<span class="token punctuation">.</span><span class="token function">GetTask</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>X <span class="token operator">=</span> <span class="token number">1</span> t<span class="token punctuation">.</span><span class="token function">GetTask</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>Y <span class="token operator">=</span> <span class="token number">2</span> t<span class="token punctuation">.</span><span class="token function">Process</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"% v\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

结果:

<pre><code class="lang-go hljs"><span class="token operator">*</span>main<span class="token punctuation">.</span>Task <span class="token operator">&</span><span class="token punctuation">{</span>TaskId<span class="token punctuation">:</span>xxxxxx X<span class="token punctuation">:</span><span class="token number">1</span> Y<span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">}</span> <span class="token operator">&</span><span class="token punctuation">{</span>TaskId<span class="token punctuation">:</span>xxxxxx X<span class="token punctuation">:</span><span class="token number">1</span> Y<span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">}</span> </code></pre> 到此这篇关于“Go语言的静态类型和动态类型示例”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Go:06---语言数据类型整体介绍、数据类型检查(reflect包)、数据类型转换
go语言和php的区别是什么?
Go语言中的接口
go语言和python哪个难
golang和python有什么区别?
golang 接口_Golang之接口
golang中接口的内部实现
Go 语言到底适合干什么?
go语言核心编程_Go语言核心编程李文塔
Go语言的函数、方法和接口

[关闭]
~ ~