我一直在讀一本關于 Golang 的書,它經常使用全域變數來公開私有函式的結果。為什么不公開公共功能?這是一個例子。我來自 Java,這對我來說很棘手。使用這樣的全域變數有什么好處?
編輯:我注意到沒有括號我不是在呼叫函式。它只是一個指標。這是一個很好的做法還是有一些優點?
package config
import "time"
var (
GetHTTPServerAddress = getHTTPServerAddress
GetHTTPReadTimeout = getHTTPReadTimeout
GetHTTPWriteTimeout = getHTTPWriteTimeout
)
func getHTTPServerAddress() string {
return getConfigString("http.server_address")
}
func getHTTPReadTimeout() time.Duration {
return getConfigDuration("http.read_timeout")
}
func getHTTPWriteTimeout() time.Duration {
return getConfigDuration("http.write_timeout")
}
uj5u.com熱心網友回復:
我一直在讀一本關于 Golang 的書,它經常使用全域變數來公開私有函式的結果。
公開私有函式的結果,而不是函式本身;你的例子有點不對勁。如果沒有括號,您將暴露函式本身。
package main
import (
"fmt"
)
var(
FooItself = foo // (func() string)(0x108b720)
FooResult = foo() // "bar"
)
func main() {
fmt.Printf("%#v\n", FooItself)
fmt.Printf("%#v\n", FooResult)
}
func foo() string {
return "bar"
}
試試吧。
您的示例看起來更像這樣。
package config
var (
// You wouldn't call the variable "Get*", that exposes
// the implementation.
HTTPServerAddress = getHTTPServerAddress()
HTTPReadTimeout = getHTTPReadTimeout()
HTTPWriteTimeout = getHTTPWriteTimeout()
)
func getHTTPServerAddress() string {
return getConfigString("http.server_address")
}
func getHTTPReadTimeout() time.Duration {
return getConfigDuration("http.read_timeout")
}
func getHTTPWriteTimeout() time.Duration {
return getConfigDuration("http.write_timeout")
}
但是不需要私有方法。只需運行該函式并將其分配給全域。
package config
var (
HTTPServerAddress = getConfigString("http.server_address")
HTTPReadTimeout = getConfigDuration("http.read_timeout")
HTTPWriteTimeout = getConfigDuration("http.write_timeout")
)
現在人們可以使用config.HTTPServerAddress并且細節保持隱藏,而無需額外的方法層。
是的,它可以在結果公共函式上完成。一個非常常見的例子是錯誤代碼。例如,在net/http.
var (
ErrBodyNotAllowed = errors.New("http: request method or response status code does not allow body")
ErrHijacked = errors.New("http: connection has been hijacked")
)
在 Java 中,您可以為每種型別的錯誤創建一個例外子類。在 Go 中,您創建一個物件,將其作為全域變數共享,并且所有內容都參考該物件。
目的是向用戶隱藏詳細資訊。錯誤的確切措辭可能會改變,但只要每個人都參考net.http.ErrBodyNotAllowed他們的代碼,它仍然有效。
io/fs 有一個更復雜的例子來展示其私有方法的結果。
var (
ErrInvalid = errInvalid() // "invalid argument"
ErrPermission = errPermission() // "permission denied"
ErrExist = errExist() // "file already exists"
ErrNotExist = errNotExist() // "file does not exist"
ErrClosed = errClosed() // "file already closed"
)
func errInvalid() error { return oserror.ErrInvalid }
func errPermission() error { return oserror.ErrPermission }
func errExist() error { return oserror.ErrExist }
func errNotExist() error { return oserror.ErrNotExist }
func errClosed() error { return oserror.ErrClosed }
為什么在這里使用私有方法包裝器?為什么不ErrInvalid = oserror.ErrInvalid呢?
(我假設)Go 想要oserror隱藏,即使是在檔案中!
oserror 只是制作錯誤物件來定義其可能的錯誤。
package oserror
import "errors"
var (
ErrInvalid = errors.New("invalid argument")
ErrPermission = errors.New("permission denied")
ErrExist = errors.New("file already exists")
ErrNotExist = errors.New("file does not exist")
ErrClosed = errors.New("file already closed")
)
uj5u.com熱心網友回復:
如果它是函式的結果,則可能類似于static成員初始化,甚至可能是static final.
您鏈接的示例表明它是某種配置加載程序,并且值已公開以供全球使用。
預計算資料也并非聞所未聞。
但是,如果您看到函式指標,則可以啟用模擬。
天啊。有時它也只是一個反模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393709.html
標籤:去
上一篇:中間件中的grpc連接時間度量
下一篇:檢查時間戳是否在兩個日期之間
