2014-03-25 61 views
11

spec說:常量在golang中是什麼意思?

常量可以鍵入或無類型

我有在我的理解有點疑問

。在spec 考慮這個例子:

const l = "hi"    // l == "hi" (untyped string constant) 
const m = string(k)  // m == "x" (type string) 

該規範表示:在一個變量聲明或使用時

常數可以被給予類型明確地由恆定聲明或 轉換,或隱式 轉讓或作爲表達式

操作數通過這一說法,爲什麼不l因爲這類型顯然是一個constan t聲明?

此行爲是更清晰與其他example

type Foo string 
func f(a Foo) {} 

func main() { 
    f("sarkozy") 

    const t = "julie gayet" 
    f(t) 

    s := "hollande" 
    //compile error 
    // f(s) 

    f(Foo(s)) // ok 
} 

那是f("sarkozy")編譯是由於在規格上可轉讓這個說法的原因是什麼?

x是由類型T的值的類型化表示的恆定

我的參數爲以下:

  • 「齊」一個無類型字面。
  • 因此,「齊」由Foo是表示的是指我可以鍵入強迫這樣Foo("sarkozy")
  • f(s)失敗,因爲s不是無類型

回答

13

爲什麼不是l類型,因爲它顯然是一個常量聲明?

是的,這顯然是一個常量聲明,作爲你的報價說:

常數可以通過常量聲明被賦予一個類型明確

然而,你的情況有沒有明確給出類型。只有當「用於變量聲明或賦值時,或者作爲表達式」「中的操作數時,才能使用隱式賦予的類型。

f(「sarkozy」)編譯的原因是由於規範中可賦值性的這種說法嗎?

是的,f("sarkozy")編譯的原因是因爲「sarkozy」的無類型常量在用作表達式中的操作數時具有隱式給定的類型,例如在您的情況下。

「薩科齊」是隱式給出的Foo

類型那麼,爲什麼不f(s)編譯?(好的,這不是問題,但問題仍然存在)

您的論點指出:「f(s)失敗,因爲s不是無類型的。

確實s不是無類型的。 s是一個變量而不是一個常量,變量不能是無類型的。

在GO規格爲Variable Declarations規定:

如果類型不存在,並且相應的表達式求,聲明的變量的類型是如§Assignments描述的類型化常數。

而這是指,從我的理解以下內容:

恆定首先轉化分別爲bool類型,符,INT,float64,complex128或串,這取決於該值是否是一個布爾,符文,整數,浮點數,複數或字符串常量。

所以,下面的行:

s := "hollande" 

會因爲右邊的表達式是一個無類型字符串常量聲明變量(不是常數)string類型的s。該類型在變量聲明期間隱式給出,而不是通過分析它將在以後使用的什麼上下文。

然後,f(s)將導致編譯錯誤,因爲您嘗試使用類型爲string的值,其中預期的值爲Foo

+0

謝謝。這個「變量不能被無類型化」是我理解的關鍵。 – canadadry