圍棋

2017-01-17 67 views
0

初始化一個空字符串中去,你可以通過以下方式初始化一個空字符串(在一個函數)慣用方式:圍棋

var a string 
var b = "" 
c := "" 

據我所知,每個語句在語義上是相同的。他們中的一個比其他人更習慣嗎?

+2

我不認爲有一種慣用的方式。如果可以的話,我更喜歡#3,因爲它更短。 –

+1

您忘記了最詳細的聲明'var a string =「」',我儘可能堅持#3。 – jmaloney

回答

2

您應該選擇哪個代碼更清晰。如果實際上會使用零值(例如,當您使用空字符串開始並將其他字符串連接到該字符串時),則使用:=表單可能是最清晰的。如果您只是聲明變量,稍後將爲其分配一個不同的值,請使用var

1

沒有聲明空變量的方式,但也有一些事情要記住,就像你不能使用:=快捷方式的函數體之外,因爲它們可以與var

var (
    name string 
    age int64 
) 

我發現var name = ""是,你聲明一個空的變量清晰的指示,但我喜歡的類型明晰var name string。無論如何,請考慮其中您正在聲明變量。有時候在功能體外面立刻都適合,但是往往是最接近你實際使用它的地方是最好的。

搶(?派克)上mailthread頂級聲明

在頂層,VAR寫道(或常量或類型或FUNC)是必要的:每個項目必須由一個引進與識別語句邊界相關的ur-syntactic原因的關鍵字。隨着後來的分號變化,我認爲在某些情況下可以消除對var的需要,但由於const,type和func必須保留,所以這不是一個有說服力的論點。

有一個在「短變量」聲明某一模糊度(使用:=),至於是否該變量被聲明重新聲明specs概述:

不同於常規變量聲明中,一個簡短的變量聲明可以重新聲明它們最初在同一個塊中聲明的變量(或參數列表,如果該塊是函數體),並且至少有一個非空變量是新的。因此,重新宣佈只能出現在多變量的短期聲明中。重新申報不會引入新的變數;它只是爲原件分配一個新的值。

0

生成的代碼(使用當前編譯器 - Go 1.7.4)完全沒有區別,並且gometalinter也不會抱怨這些代碼。使用你喜歡的任何一個。

一些差異:

  • 您只能使用功能短期變量聲明。
  • 使用短變量聲明,您可以在一行中創建多個類型的變量,例如,

    a, b := "", 0 
    

以下3個應用生成相同的代碼:

a.go

package main 
import "fmt" 
func main() { var a string; fmt.Println(a) } 

b.go

package main 
import "fmt" 
func main() { var a = ""; fmt.Println(a) } 

c.go

package main 
import "fmt" 
func main() { a := ""; fmt.Println(a) } 

要驗證,建立每個(例如,與go build -o a),並使用diff在Linux上比較可執行二進制碼:

diff a b && diff a c 
0
var a string 

它不是立即可見,它的的人不是真正精通走空字符串。有些人可能會認爲這是零/零值。

var b = "" 

會是最明確的,意味着每個人都看到它是一個包含空字符串的變量。

b := "" 

The:= assigment是如此常見,以至於它會是我看來最易讀的。當然,除非它是功能體的外部。

0

我試圖堅持短期宣言的原因有幾個。

  1. 這是短
  2. 一致性
  3. 分配內存地圖,切片和指針結構和類型。

雖然var a stringa := ""是相同的,b := []T{}var b []T是不一樣的。處理切片和貼圖時,較短的聲明不會爲零。更經常的是(尤其是使用地圖),我想分配內存。

有幾種情況下,將需要var,例如,您正在調用將填充類型的屬性的函數。

var err error 
foo.Name, err = getFooName() 

使用在上述情況:=語法會報錯了,因爲foo.Name已聲明。