2016-02-05 39 views
3

我很難將字符串分配給類型字符串。所以,我有這種類型的:指定字符串類型golang

type Username string 

然後我有一個返回一個字符串

我試圖做的是設置的用戶名對返回函數的字符串:

u := &Username{returnedString} 

我也試過

var u Username 
u = returnedString 

但我總是得到一個錯誤。

+0

用戶名是一個字符串,而不是一個結構,所以你不能做u:=&Username {returnedString}。有沒有理由你不能做var u字符串? –

+0

你能給出關於錯誤的更多細節嗎? –

+0

@ william.taylor.09用戶名不是一個字符串,而是一個構建在基礎類型字符串上的自定義類型。 – Snowman

回答

4

正如其他人所指出的那樣,你需要做一個顯式類型轉換:

someString := funcThatReturnsString() 
u := Username(someString) 

我建議你上隱式類型轉換讀this article。具體來說,Honnef的引用上assignability Go的規格:

A value x is assignable to a variable of type T ("x is assignable to T") in any of these cases:

  • x's type V and T have identical underlying types and at least one of V or T is not a named type.

所以,在你的榜樣,在returnedString已經是一個「命名類型」:它具有類型string.如果你已經不是做了什麼樣

var u Username 
u = "some string" 

你因爲"some string"將被隱含地轉換爲Username類型,並且stringUsername都具有基本類型string

+1

如果我第一次看到這個,我不會發布我的答案。 – Snowman

4

您已經創建了一個用戶定義的類型「用戶名」。您無法將一種類型的值分配給另一種類型(在本例中爲字符串到用戶名)而無需轉換。順便說一句,你可以給它分配一個字符串文字。

var u Username 
u = "test" 

會工作。

var u Username 
    var s string 

    s = "test" 
    u = s 

會給你的錯誤:

cannot use s (type string) as type Username in assignment

可以從一種類型轉換爲另一種,所以...:

var u Username 
    var s string 
    s = "test" 
    u = Username(s) 

...也可以工作。 「u」將具有值「test」的用戶名類型。

爲了記錄這些不是作爲慣用的例子。我只是試圖清楚地說明這裏的類型是怎麼回事。