天天看點

golang 強制類型轉換

Go語言是個強類型語言。也就是說Go對類型要求嚴格,不同類型不能進行指派操作。指針也是具有明确類型的對象,進行嚴格類型檢查。下面的代碼會産生編譯錯誤

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<code>package</code> <code>main</code>

<code>                         </code> 

<code>import</code> <code>(</code>

<code>    </code><code>"fmt"</code>

<code>)</code>

<code>                            </code> 

<code>func main() {</code>

<code>    </code><code>u := uint32(</code><code>32</code><code>)</code>

<code>    </code><code>i := int32(</code><code>1</code><code>)</code>

<code>    </code><code>fmt.Println(&amp;u, &amp;i) </code><code>// 列印出位址</code>

<code>    </code><code>p := &amp;i </code><code>// p 的類型是 *int32</code>

<code>    </code><code>p = &amp;u </code><code>// &amp;u的類型是 *uint32,于 p 的類型不同,不能指派  </code>

<code>    </code><code>p = (*int32)(&amp;u) </code><code>// 這種類型轉換文法也是無效的</code>

<code>    </code><code>fmt.Println(p)</code>

<code>}</code>

<b></b>

unsafe 包提供的Pointer方法可以完成這個任務

16

<code>         </code> 

<code>    </code><code>"unsafe"</code>

<code>    </code><code>fmt.Println(&amp;u, &amp;i)</code>

<code>    </code><code>p := &amp;i</code>

<code>    </code><code>p = (*int32)(&amp;u)</code>

<code>    </code><code>p = (*int32)(unsafe.Pointer(&amp;u))</code>

補充:實際使用中unsafe可用場景很少,稍微複雜一點的結構,比如struct,unsafe根本不能适用,正确的方法還是要靠 type assertion

ps:發現一種用法,看代碼

17

18

19

20

21

22

23

<code>   </code> 

<code>    </code><code>"text/template"</code>

<code>// MyTemplate 定義和 template.Template 隻是形似</code>

<code>type MyTemplate struct {</code>

<code>    </code><code>name       string</code>

<code>    </code><code>parseTree  *unsafe.Pointer</code>

<code>    </code><code>common     *unsafe.Pointer</code>

<code>    </code><code>leftDelim  string</code>

<code>    </code><code>rightDelim string</code>

<code>    </code><code>t := template.New(</code><code>"Foo"</code><code>)</code>

<code>    </code><code>p := (*My&lt;span&gt;&lt;/span&gt;Template&lt;span&gt;&lt;/span&gt;)(unsafe.Pointer(t))</code>

<code>    </code><code>p.name = </code><code>"Bar"</code> <code>// 關鍵在這裡,突破私有成員</code>

<code>    </code><code>fmt.Println(p, t)</code>

<code></code>

本文轉自 ponpon_ 51CTO部落格,原文連結:http://blog.51cto.com/liuxp0827/1353470,如需轉載請自行聯系原作者