亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中編碼的正確方法是什么?

在 Go 中編碼的正確方法是什么?

Go
慕碼人8056858 2021-11-29 16:31:37
最近發現Revel是一個非常不錯的MVC web框架,想試試看。問題是我剛接觸 Go,一切似乎都有些不同。使用PHP時,我只是將文件放入/var/www/文件夾,或者使用一些IDE,然后我可以打開瀏覽器并實時測試它們。使用 RoR 或 Node.js 甚至更容易,我只需轉到本地項目文件夾(無論在哪里),在終端中運行一個命令,就可以在localhost:3000.這樣,我的本地機器上就有以下結構:home└── mark     └── code         ├── php         │   └── my_php_app         └── ruby             └── my_ruby_app它們都是通過 git 同步的。然后,當我想在我的遠程機器上部署時,我只需將它們拉入/var/www/并設置 Apache2/Nginx但是我如何使用 Go 應用程序做到這一點?我在家里的 Linux 機器和 VPS 上都安裝了 Go。當我打開~/code/go/mygoapp并嘗試使用 運行它時revel run,它說在GOPATH. 所以,我假設,我需要將我所有的 Go 項目與我的其他項目分開,在GOPATH,可以是/usr/local/go/src/或~/gocode/src/。問題是:我應該怎么做,如果我要保持我所有的圍棋/狂歡項目go文件夾以及php和ruby本地計算機上那樣:home└── mark     └── code         ├── go         │   └── my_revel_app         ├── php         │   └── my_php_app         └── ruby             └── my_ruby_app以及如何以正確的方式將它們實際部署到我的遠程服務器上?如果我仍然需要為此使用 GOPATH,我該如何命名包?是GOPATH/src/mygoapp,GOPATH/src/mark/mygoapp還是GOPATH/src/bitbucket.org/mark/mygoapp(雖然這個 repo 是私有的)?我知道,這可能是一個菜鳥問題,但我在這里看不到邏輯。即使使用簡單的 Go 程序,我也不需要將它們放到 GOPATH 中才能運行。
查看完整描述

3 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

您添加GOPATH包含 go source 的目錄(工作區),并符合結構src, pkg, bin。您可以在GOPATH. 在您的系統上相應地定義變量。在GOPATH你的服務器上很可能將是一個比你的本地機器不同。

您可以使用git來共享您的項目。在 github 或 bitbucket 上創建一個帳戶,并進行同步。

你的GOPATH點數去工作區。第一個用于存儲go get包。


查看完整回答
反對 回復 2021-11-29
?
慕蓋茨4494581

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()))


}

所以,我希望這會有所幫助。


查看完整回答
反對 回復 2021-11-29
?
至尊寶的傳說

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 是私有的)?

我想第三個將是命名包的最合適的方式,因為導入應該以主機名開頭,然后是其余的內容。


查看完整回答
反對 回復 2021-11-29
  • 3 回答
  • 0 關注
  • 247 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號