2013-01-07 165 views
4

我查看了Golang文檔,並沒有看到如何實現我期望做的示例。具體來說,我想寫從索引節點地圖,通過syscall.Stat_t.Ino代表,其中有我的機器上輸入uint64,以ino_entry,定義爲獲取靜態類型的struct元素

type ino_entry struct { 
    st *syscall.Stat_t 
    nodes []string 
} 

其中節點代表硬鏈接的所有文件的名稱i節點。但是,如果可以的話,我想避免將字面類型uint64放入地圖的規範中。也就是說,我不是寫map [uint64] ino_entry,而是寫map [typeof(syscall.Stat_t.Ino)] ino_entry,其中typeof(x)返回x的靜態(即編譯時)類型。我試過map [syscall.Stat_t.Ino] ino_entry,並通過與類型開關類比,map [syscall.Stat_t.Ino.(type)] ino_entry,但這兩個都是語法錯誤。不用說,map [reflect.Typeof(syscall.Stat_t.Ino)] ino_entry不起作用。據我所知,實現這一點,而不硬編碼結構元素的類型的唯一方法是使用inomap := make(map [interface{}] ino_entry),然後使用類型斷言訪問元素(但我不知道這個正確的語法)。

有沒有辦法根據另一個變量或結構或接口成員的靜態類型聲明變量的類型,而無需明確硬編碼該類型?

+0

它看起來並不像我所要求的是可能的,所以我提出了一個[問題](http://code.google.com/p/go/issues/detail?id = 4626)去。 – telotortium

回答

2

它看起來像你試圖使用反射來確保機器的可移植性。如果是這種情況,您可以使用更好的工具。

go build可以處理基於arch和os的構建的條件文件包含。

因此,請爲您支持的每個拱門和操作系統組合創建一些文件。在每個文件的頂部添加一些構建約束。

// +build linux,386例如會導致go命令只在具有386拱形的Linux機器上使用此文件。

然後在文件中添加一個類型別名適合該拱類型:type Ino uint64

最後創建地圖作爲map[Ino]ino_entry

Wala!機器可移植性使用類型別名和條件文件包含去。

您可以瞭解更多關於去的這裏建立約束:http://golang.org/pkg/go/build/

+0

由於您告訴我機器可移植性問題的最佳解決方法(儘管在這種情況下,它看起來不一定是問題),因此接受。 – telotortium

0

參考在OP最後一個問題:是的,有一種方法如何基於類型的表達式來聲明一個變量的類型,而不hardcopying表達式的類型:

v := expr // equal to var v typeof(expr); v = expr; 

expr還包括大部分你所提到的實體,即另一個變量,結構類型爲「東西」,但是而不是接口成員(因爲規範中沒有提到任何東西的成員)。

不幸的是,這與聲明地圖類型無關,其中/當類型文字使用的格式爲map[T]U。這裏TU不能如推測,如在上面討論的短變量聲明的情況。

0

Stat_t對於任何機器都有same definition,其Ino字段總是uint64,所以這應該不成問題。

如果有一個編譯時操作符靜態獲取此類型,它必須隱藏起來。

但是,您可以定義一個類型別名:type ino_id uint64,這對我來說看起來更易讀。