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(&u, &i) </code><code>// 列印出位址</code>
<code> </code><code>p := &i </code><code>// p 的類型是 *int32</code>
<code> </code><code>p = &u </code><code>// &u的類型是 *uint32,于 p 的類型不同,不能指派 </code>
<code> </code><code>p = (*int32)(&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(&u, &i)</code>
<code> </code><code>p := &i</code>
<code> </code><code>p = (*int32)(&u)</code>
<code> </code><code>p = (*int32)(unsafe.Pointer(&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<span></span>Template<span></span>)(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,如需轉載請自行聯系原作者