2016-01-24 31 views
1

我正在使用指針第一次,我有什麼可能是一個簡單的問題。我應該通過指針作爲參數

我有兩個功能mainother。如果在main函數中有一個變量,我想在other函數中提供該函數,我應該將它作爲參數傳遞還是破壞指針對象?

OPTION 1

func main() { 
    myVar := "hello world" 
    other(&myVar) 
} 

func other(s *string) { 
    println(s) 
} 

OPTION 2

func main() { 
    myVar := "hello world" 
    other() 
} 

func other() { 
    println(*myVar) //Is myVar even accessible here? 
} 
+0

你可以嘗試一下[play.golang.org](http://play.golang.org/p/AQi-KLMhS7) – Mark

+0

你的選擇是不常見的。只要通過價值。並請:以Go的旅程。 – Volker

回答

6

不知道爲什麼你有downvoted ...第二個選項不能編譯,因爲裏面的其他功能myVar的是不存在。每個變量都有一個範圍。該變量只能在其範圍內訪問。

(如果您想了解更多關於去有多種不同的範圍,我建議以下鏈接https://www.golang-book.com/books/web/01-02 - 向下滾動到範圍它也有一個很好的可視化解釋。)

爲了讓事情更清楚一點,我想補充一些例子:

OPTION 1 - 傳遞指針值

這就是你所得到的。但請確保取消引用您的指針以獲取實際的字符串。你的版本正在打印指針本身(mem-address)。看到我的變化(* s而不僅僅是s)!

func main() { 
    myVar := "hello world" 
    other(&myVar) 
} 

func other(s *string) { 
    println(*s) 
} 

選項2 - 傳遞變量值

這可能是你的意思你的選項2.

package main 

func main() { 
    myVar := "hello world" 
    other(myVar) 
} 

func other(myVar string) { 
    println(myVar) 
} 

OPTION 3 - 讓myVar的全球

也許這是你想要在第二個選項中做的事情。 myVar在這裏是全球性的(或者像golang lingo,myVar有 -level作用域),因此可以在其他函數中訪問。

var myVar = "hello world" 

func main() { 
    other() 
} 

func other() { 
    println(myVar) 
} 

至於你的問題無論您應該值或指針傳遞給變量:

一般來說,你通過指針,如果你的函數需要能夠編輯值。另外,當變量本身非常大,並且花費時間/資源來傳遞值時,您可以傳遞更有效的指針。