3 回答

TA貢獻1784條經驗 獲得超9個贊
您添加GOPATH
包含 go source 的目錄(工作區),并符合結構src, pkg, bin
。您可以在GOPATH
. 在您的系統上相應地定義變量。在GOPATH
你的服務器上很可能將是一個比你的本地機器不同。
您可以使用git
來共享您的項目。在 github 或 bitbucket 上創建一個帳戶,并進行同步。
你的GOPATH
點數去工作區。第一個用于存儲go get
包。

TA貢獻1850條經驗 獲得超11個贊
介紹
我覺得有一些誤解。讓我們繼續努力。
PHP 和 Go 之間有一些根本區別,其中之一是 PHP 是一種解釋性語言,而不是 Go,Go 是一種編譯語言。
PHP 被設計并且對于大多數應用程序來說是一種所謂的解釋性語言,這意味著每次調用 PHP 文件時,源代碼都會被翻譯成機器可讀的指令。
去另一方面是編譯型語言,這意味著源代碼被編譯成可執行的二進制一次和靜態連接是默認導致生成的可執行程序有沒有依賴關系(比它被編譯為OS等),甚至沒有去運行。因此,您可以構建一個自給自足的 Web 應用程序,包括 Web 服務器和(使用特殊用途的 Go 包)甚至圖像和樣式表等資源文件。
雖然您可以使用go run filename.go它只是go build執行生成的已編譯二進制文件的快捷方式,但正如以下輸出所go run --help證明的那樣:
go run [build flags] [-exec xprog] gofiles... [參數...]
Run 編譯并運行包含命名的 Go 源文件的主包。Go 源文件被定義為以文字“.go”后綴結尾的文件。
默認情況下,'go run' 直接運行編譯后的二進制文件:'a.out arguments...'。
例子
我將向您展示 $GOPATH 及其子目錄是如何互連的。
讓我們以最簡單的 Web 服務器示例為例:
package main
import (
"net/http"
"fmt"
)
// Default Request Handler
func defaultHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "<h1>Hello %s!</h1>", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", defaultHandler)
http.ListenAndServe(":8080", nil)
}
我把它放到這樣的目錄結構中,包括權限和文件大小。這是在 OS X 系統上
$GOPATH/src/github.com/mwmahlberg/DemoServer/
└── [-rw-r--r-- 178] server_main.go
現在,當調用GOOS=linux go build ./...目錄 DemoServer 時,在我的情況下,交叉編譯二進制文件以在 linux 上運行。二進制文件得到構建,目錄如下所示:
$GOPATH/src/github.com/mwmahlberg/DemoServer/
├── [-rwxr-xr-x 6.2M] DemoServer
└── [-rw-r--r-- 178] server_main.go
請注意server具有相當大的 6.3M 大小的可執行文件。但是,讓我們檢查一下:
$ file DemoServer
server: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
您實際上可以將此可執行文件復制到任何 64 位 Linux 并通過調用運行它
$ ./DemoServer
現在,使用http://hostname:8080/Mark調用相應的服務器,您將看到一個網站歡迎您。
并不是說這使部署變得非常容易。無需處理任何依賴項,無需配置額外的 Web 服務器。你可以直接復制二進制文件并運行它。但是,這并不妨礙您使用更復雜的方法,例如創建像.deb或.rpm或(我更喜歡)Docker 映像之類的軟件包。
根據下面的子目錄$GOPATH/src:實際上,您可以完全自由地在那里組織您的包。然而,三胞胎
代碼主機/用戶名/包名
是有原因的。該go get命令實際上可以使用 git、Mercurial 和 bzr 站點來自動下載包。有關詳細信息,請參閱包發布。是的,直接聯系那些代碼托管站點。該go get實際上是依賴于混帳至少。三元組簡單地反映了代碼的全局可訪問位置。當然,您可以將代碼存儲在 $GOPATH/src/foobar并將其推送到github.com/mark/foobar,盡管這變得相當不透明,尤其是當我在 github.com 和 bitbucket.org 上的所有其他人托管開放項目時這樣做。
現在,讓我們做一些有用的事情,并在調用日期 url 時顯示日期:
package main
import (
"net/http"
"fmt"
"time"
)
// Default Request Handler
func defaultHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "<h1>Hello %s!</h1>", r.URL.Path[1:])
}
func dateHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w,"<h1>%s</h1>",time.Now())
}
func main() {
http.HandleFunc("/date",dateHandler)
http.HandleFunc("/", defaultHandler)
http.ListenAndServe(":8080", nil)
}
然而,我們的主函數中仍然有所有的處理程序。我們將提取 defaultHandler 和 dateHandler:
$GOPATH/src/github.com/mwmahlberg/DemoServer/
├── [-rw-r--r-- 214] dateHandler.go
├── [-rw-r--r-- 165] defaultHandler.go
└── [-rw-r--r-- 178] server_main.go
我們server_main.go現在看起來像這樣:
package main
import (
"net/http"
)
func main() {
http.HandleFunc("/date",dateHandler)
http.HandleFunc("/", defaultHandler)
http.ListenAndServe(":8080", nil)
}
的defaultHandler.go:
package main
import (
"net/http"
"fmt"
)
func defaultHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "<h1>Hello %s!</h1>", r.URL.Path[1:])
}
還有我們的dateHandler.go:
package main
import (
"net/http"
"fmt"
"time"
)
func dateHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w,"<h1>%s</h1>",time.Now())
}
讓我們假設我們有一個特定于應用程序的可重用函數,我們想要放入一個包中。為了這個例子,我們將有一個用于 dateHandler 的格式化程序。
$GOPATH/src/github.com/mwmahlberg/DemoServer/
├── [-rw-r--r-- 214] dateHandler.go
├── [-rw-r--r-- 165] defaultHandler.go
├── [drwxr-xr-x 102] formatter
│ └── [-rw-r--r-- 110] dateformatter.go
└── [-rw-r--r-- 178] server_main.go
內容dateformatter.go很簡單:
package formatter
import (
"time"
)
func FormatDate(d time.Time) string {
return d.Format(time.RFC850)
}
我們在我們的日期處理程序中使用它:
package main
import (
"fmt"
"net/http"
"time"
"github.com/mwmahlberg/DemoServer/formatter"
)
func dateHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, formatter.FormatDate(time.Now()))
}
所以,我希望這會有所幫助。

TA貢獻1789條經驗 獲得超10個贊
我會一一回答你的問題:
1)如果我想將所有 Go/Revel 項目與本地機器上的 php 和 ruby 一起保存在 go 文件夾中,我該怎么辦:
其實你不能。Go 提出了一種構建 Go 代碼結構的方法,理想情況下應該遵循它。一個工作區由 Go 項目共享,而其他項目則不同,每個項目都有單獨的工作區。
2)我如何以正確的方式在我的遠程服務器上實際部署它們?
我能想到的一種有效方法是擁有一個單獨的構建服務器,在其中構建所有包以及獲取遠程包(github.com)。Tar 構建的項目。轉到您的遠程服務器,只需從 bin 運行可執行文件。這節省了在生產服務器上獲取和構建遠程包的時間。
3) 如果我仍然需要為此使用 GOPATH,我該如何命名包?是 GOPATH/src/mygoapp、GOPATH/src/mark/mygoapp 還是 GOPATH/src/bitbucket.org/mark/mygoapp(雖然這個 repo 是私有的)?
我想第三個將是命名包的最合適的方式,因為導入應該以主機名開頭,然后是其余的內容。
- 3 回答
- 0 關注
- 247 瀏覽
添加回答
舉報