2016-07-29 16 views
2

在我的遊樂場代碼這兒有2種類型的股票非常相似字段定義這個樣子,轉換類型A到那裏的TypeB基礎字段類型相同

type Int64 int64 

type TA struct { 
    A Int64 
    B string 
} 

type TB struct { 
    A int64 
    B string 
} 

我如何在兩者之間轉換用最少的代碼和PERF成本?

https://play.golang.org/p/VFERyT-RgK

附:經測試,TA(some_tb_value)與上述案例一樣,只有在TA.A與TB.A完全相同的情況下才有效。但是,使底層類型(Int64-> int64)完全相同並不適合我需要的用例。

p.s.使用某些協議(json)串行化some_tb_value並將其解串回TA類型的指針是可能的,但是對於關鍵路徑使用它可能太重了

+0

相關/可能重複[分配結構與另一個結構](http://stackoverflow.com/questions/31981592/assign-struct-with-another-struct) – icza

+0

@icza感謝指出。體現是可能的解決方案我正在尋找是否有其他任何高性能方法用於大量使用。 –

回答

1

由於它們是不同的結構類型,所以不能轉換它們。

一個解決方案是使用反射(reflect包)來複制字段。

而且因爲它們具有相同的內存佈局,另一種解決方案是使用包裝unsafe

func main() { 
    var a TA = TA{1, "I'm TA"} 
    var b TB = TB{2, "I'm TB"} 
    fmt.Println(TA2TB(&a), TB2TA(&b)) 
} 

func TA2TB(a *TA) *TB { 
    return (*TB)(unsafe.Pointer(a)) 
} 
func TB2TA(b *TB) *TA { 
    return (*TA)(unsafe.Pointer(b)) 
} 

輸出(嘗試在Go Playground):

&{1 I'm TA} &{2 I'm TB} 

但是要知道,使用unsafe你失去所有類型的安全檢查。如果將來修改類型,代碼將繼續編譯,但運行時可能會出現神祕錯誤(如果幸運的話,運行時恐慌,最壞情況下無聲不守規矩,最壞情況下完全崩潰)。

最好是重構你的代碼並使用相同的底層類型,所以你可以簡單地做一個類型conversion

+0

同意重構。它背後的真實例子是我試圖將原生Go類型(有很多方法)放在一起,這裏的類型只是原始類型,我可能真的需要這種類型的轉換。 (只是提供背景) –

+0

嗨@icza,使這個解決方案完整,任何想法如何系統地驗證兩種類型共享完全相同的內存佈局?在任何嚴肅的部署中使用這個強大的演員陣容之前,人們可能會在離線/操場上運行它以驗證正確性。 –