我正在查看Writing Web ApplicationGolang 檔案的章節,發現了這個函式的語法:
func (p *Page) save() error {
filename := p.Title ".txt"
return os.WriteFile(filename, p.Body, 0600)
}
從檔案中... This is a method named save that takes as its receiver p, a pointer to Page . It takes no parameters, and returns a value of type error.
- 像這樣宣告函式有什么區別
func save(p *Page) error{}?接收器和函式引數有什么區別? - 當我看到它從包中回傳一個函式時,為什么它回傳一個型別為 error 的值
os?
提前謝謝你,可能是一個愚蠢的問題,但我對 Golang 有點陌生,
uj5u.com熱心網友回復:
- 像這樣宣告函式有什么區別
func save(p *Page) error{}?接收器和函式引數有什么區別?
它們在功能上是相同的,這就是 Go 在水下編譯時所做的。但是有一些語意差異:
- 最大的區別是你會呼叫
func (p *Page) save() errorlikesomePage.save()和func save(p *Page) errorassave(somePage)。 - go.dev生成的檔案會將其列為包中的函式,而不是方法
Page(假設它是匯出函式)。 - 當宣告一個類似函式時,
func save(p *Page) error不會Page像方法那樣實作一個介面interface{ save() }。 - Go 會在呼叫方法時為您在指標和值之間進行轉換,但對于函式,您必須始終自己傳遞正確的引數型別。例如:
type Page struct {
Field string
}
func (p *Page) PtrString() string {
return p.Field
}
func (p Page) String() string {
return p.Field
}
func PageString(page Page) string {
return page.Field
}
func PagePtrString(page *Page) string {
return page.Field
}
func main() {
p := Page{Field: "Hello world"}
// Both work
fmt.Println(p.String())
fmt.Println(p.PtrString()) // This passes a pointer implicitly
// This works
fmt.Println(PageString(p))
// This doesn't compile
fmt.Println(PagePtrString(p)) // cannot use p (type Page) as type *Page in argument to PagePtrString
// But this does, you have to specify you want to pass a pointer
fmt.Println(PagePtrString(&p))
}
這是一個鏈接,其中包含有關指標和值接收器之間差異的更多詳細資訊。
- 當我看到它從 os 包回傳一個函式時,為什么它回傳一個錯誤型別的值?
它不回傳函式本身,而是呼叫它并回傳 的回傳值os.WriteFile,即error
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/417944.html
標籤:
