2013-08-02 185 views
3

我想直接從包中暴露函數。
所以我可以直接調用我的包而不是mypackage.Somepublic()方法。在包中暴露函數

package main 

import (
    "mypackage" 
    "fmt" 
) 

func main() { 
    var result = mypackage() 
    fmt.Println(result)  
} 

在node.js的,例如,您可以公開一個匿名函數

module.export = function() { 
    console.log('ta da!'); 
} 

或對象

module.export = { 
    doMagic: function() { 
     console.log('ta da!'); 
    } 
}; 
+0

你不能在Go中這樣做。你不能說'import'pkg「'然後''pkg()'。大多數模塊系統不允許這樣做。 CommonJS是特別的:) – Marius

回答

8

雖然您的Node.js示例沒有直接的類比,但您可以在Go中執行的操作是「本地導入」。基本上,本地導入會導入所有項目 - 函數,類型,變量等 - 將包導出到本地名稱空間,以便可以像在本地定義一樣訪問它們。您可以通過使用點預裝包名來完成此操作。例如:

import . "fmt" 

func main() { 
    Println("Hello!") // Same as fmt.Println("Hello!") 
} 

(請參閱action)。

這將適用於fmt導出的任何項目。您可以使用mypackage(這是從您發佈的代碼修改而來)做類似的事情:

package main 

import (
    . "mypackage" 
    "fmt" 
) 

func main() { 
    var result = Somepublic() // Equivalent to mypackage.Somepublic() 
    fmt.Println(result)  
} 
2

轉到Packages沒有什麼你也許認爲他們是。

Go程序通過鏈接包來構建。一個包依次由一個或多個源文件構成,這些源文件一起聲明屬於包的常量,類型,變量和函數,並且可以在同一個包的所有文件中訪問它們。這些元素可能會被導出並用於其他包中。

它不同於例如#include

+0

好吧,我不明白倒票。除此之外。 因爲在進出口一流功能,我只是問是否有這樣的事情通過包輸出功能。就像你在node.js中做的一樣。 Node.js要求與#include不一樣。 有效的答案可能是: 不,不可能,但您可以創建一個New()函數,並從那裏返回一個匿名函數。例如。 – alfonsodev

+3

親愛的孤獨匿名冒險家。我想你出於同樣的原因來到這裏。所以,基本的答案是。在名稱中使用大寫字母;)來源:https://tour.golang。組織/基礎/ 3 - 是的,我也很驚訝。我期待一些奇特的東西,但就是這樣。大寫字母 - 出口,小寫字母 - 不出口;) – mko

+0

@mko謝謝你,先生! – sten

2

你目前需要得到您的結構。我想假設您的內容是src文件夾

src/main.go

package main 

import (
    "fmt" 
    "./mypackage" 
) 

func main() { 
    var value mypackage.Export 
    value.DoMagic() 
    fmt.Printf("%s", value) 

} 

src/mypackage/export.go

package mypackage 

import "fmt" 

type Export struct { 
} 

func (c Export) DoMagic() { 
    fmt.Println("Magic function was called") 
} 

func (c Export) String() string { 
    return fmt.Sprint("ta da! \n") 
} 

運行go run main.go你會獲得

Magic function was called 
ta da!