什麼是GO適當的方式來創建一個FetchUrl/GetURL函數從命令行工作,並從谷歌應用程序引擎以其自定義的方式來獲取URL的作品。跨平臺代碼爲appengine
我有基本的代碼,獲取和處理一些URL上的數據。我希望能夠從我在桌面上使用的代碼調用它,並將代碼部署到應用程序引擎。
希望多數民衆贊成清楚,如果沒有請讓我知道和病態澄清。
什麼是GO適當的方式來創建一個FetchUrl/GetURL函數從命令行工作,並從谷歌應用程序引擎以其自定義的方式來獲取URL的作品。跨平臺代碼爲appengine
我有基本的代碼,獲取和處理一些URL上的數據。我希望能夠從我在桌面上使用的代碼調用它,並將代碼部署到應用程序引擎。
希望多數民衆贊成清楚,如果沒有請讓我知道和病態澄清。
如果你有一些代碼可以在本地機器和AppEngine環境中工作,那你就什麼都不做。
如果您需要在AppEngine上做或應該做不同的事情,那麼您需要檢測環境併爲不同的環境編寫不同的代碼。
使用build constraints可以輕鬆完成此檢測和代碼選擇。您可以在.go
文件的開頭放置一條特殊註釋行,根據環境的不同,它可能也可能不會被編譯和運行。
從The Go Blog: The App Engine SDK and workspaces (GOPATH)報價:
App Engine的SDK引入了一種新的構建約束項:
"appengine"
。指定的文件將由App Engine SDK構建,並由go工具忽略。相反,指定的文件
// +build !appengine
會被App Engine SDK忽略,而go工具會很樂意構建它們。
因此,例如,您可以有兩個單獨的.go
文件,一個用於AppEngine,一個用於本地(非AppEngine)環境。在兩者中定義相同的函數(使用相同的參數列表),因此無論代碼在哪個環境中構建,函數都會有一個聲明。我們將使用這個簽名:
func GetURL(url string, r *http.Request) ([]byte, error)
注意,第二個參數(*http.Request
)只需要在AppEngine上(爲了能夠創建一個Context
),所以在當地ENV的實現不使用它(甚至可以是nil
)。
一個優雅的解決方案可以利用http.Client
類型,該類型在標準環境和AppEngine中均可用,並且可用於執行HTTP GET請求。一個http.Client
的值可以在AppEngine上獲得不同的值,但是一旦我們有一個http.Client
的值,我們可以按照相同的方式進行。所以我們將有一個共同的代碼,收到一個http.Client
,可以完成剩下的工作。
示例實現可以是這樣的:
url_local.go
:
// +build !appengine
package mypackage
import (
"net/http"
)
func GetURL(url string, r *http.Request) ([]byte, error) {
// Local GetURL implementation
return GetClient(url, &http.Client{})
}
url_gae.go
:
// +build appengine
package mypackage
import (
"google.golang.org/appengine"
"google.golang.org/appengine/urlfetch"
"net/http"
)
func GetURL(url string, r *http.Request) ([]byte, error) {
// Appengine GetURL implementation
ctx := appengine.NewContext(r)
c := urlfetch.Client(ctx)
return GetClient(url, c)
}
url_common.go
:
// No build constraint: this is common code
package mypackage
import (
"net/http"
)
func GetClient(url string, c *http.Client) ([]byte, error) {
// Implementation for both local and AppEngine
resp, err := c.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return body, nil
}
您可以在golang/appengine
項目本身中獲得一些線索。
例如,其remote_api/client.go
提供客戶端遠程連接到用戶的生產應用程序。
你去通過包括這些例子來回答這個問題。我不知道使用''+ build''的能力。非常感謝。 – Jacob