2017-07-25 119 views
-1

如何讓變量的類型爲變量類型?在Go中爲變量指定類型

這是什麼意思?我有一個python和java背景。在這兩種語言中,我都可以執行諸如將類名分配給變量的操作。

#Python 
class A: 
    def __init__(self): 
     self.a = "Some Value" 

# And asigning the class name to a variable 
class_A = A 

# And create instance from class A by using class_A 
a = class_A() 

有沒有這樣的機制讓我這樣做呢?在他們的文檔中,我無法知道該在哪裏尋找這些東西。老實說,通常我不知道這些在編程語言中被稱爲什麼。

比如我想能夠做到:

// For example, what would be the type of myType? 
var myType type = int 

我將利用這一機制,採取「類型」參數。例如:

func Infer(value interface{}, type gotype) {...} 

回答

2

有沒有這樣的機制可以讓我做到這一點?

不,沒有。

0

在旅途中有沒有這樣的事情,但型走樣可以做你需要的東西:

type MyInt int 

func (num MyFloat) TestInt() int { 
    return int(num) 
} 

即使你的類型,你必須將它轉換爲類型爲int,其你別名:

return num // Error 

Playground

0

有沒有這樣的機制讓我去做?

簡短的回答是:

長的答案是:這聽起來像一個XY Problem,所以這取決於你實際上試圖完成,有可能是一種方式。跳到最後查看我在哪裏解決您的特定用例。

我懷疑如果你想在一個變量中存儲一個數據類型,那是因爲你要比較一些其他變量的類型,或者你想創建一個這個未知類型的變量。這兩個場景可以在Go中完成。

在第一種情況下,僅僅使用一種類型的開關:

switch someVar.(type) { 
    case string: 
     // Do stringy things 
    case int: 
     // Do inty things 
} 

在語義上,這看起來很像分配的someVar類型隱含開關比較變量,則對各種類型的比較。

在我提到的第二種情況,如果你想創建一個未知類型的變量,這可以在一個迂迴的方式使用反射來完成:

type := reflect.TypeOf(someVar) 
newVar := reflect.New(type).Interface() 

這裏newVar現在是一個interface{}是包裝與someVar相同類型的變量。

在你的具體的例子:

我將利用這一機制,採取「類型」參數。例如:

func Infer(value interface{}, type gotype) {...} 

沒有,有沒有辦法做到這一點。對於Go的變量支持,它實際上與Go編譯的事實相比較少得多。

變量完全是運行時的概念。函數簽名(像Go中的所有其他類型)在編譯時固定。因此,運行時變量不可能影響編譯階段。這在任何編譯語言中都是如此,而不是Go中的一個特殊功能(或缺乏)。