目錄
- 前言
- 問題一
- 問題二
- 小結
- 推薦閱讀
前言
根據使用者的反饋,回答關于開源專案:go-gin-api
中被頻繁問到的兩個代碼寫法問題,
以如下代碼片段為例:

- 第 8 行,這種寫法是什么意思?
- 第 11 行,為什么定義一個 i() 方法?
問題一
var _ Signature = (*signature)(nil)
這代碼是什么意思?
強制 *signature 去實作 Signature 介面,編譯器會檢查 *signature 型別是否實作了 Signature 介面,
來看一個例子:
package main
import "fmt"
var _ Study = (*study)(nil)
type study struct {
Name string
}
type Study interface {
Listen(message string) string
}
func main() {
fmt.Println("hello world")
}
上面代碼會輸出 hello world 嗎?
不會!
這時會輸出:
./main.go:5:5: cannot use (*study)(nil) (type *study) as type Study in assignment:
*study does not implement Study (missing Listen method)
如果去掉這一行:
var _ Study = (*study)(nil)
這時就可以輸出 hello world 了,
問題二
i()
為什么在介面中定義一個 i() 方法?
強制 Signature 介面中所有方法只能在本包中去實作,在其他包中不允許去實作,因為介面中有小寫方法,所以在其他包無法去實作,i() 表示一個小寫方法,起其他名字也可以,
來看一個例子:
package study
type Study interface {
Listen(message string) string
i()
}
func Speak(s Study) string {
return s.Listen("abc")
}
定義了一個 Study 介面,介面中包含兩個方法,其中就有一個 i() ,
定義了一個 Speak 方法,入參是 Study 介面,方法體是執行介面中的 Listen 方法,
接下來看另一個檔案:
type stu struct {
Name string
}
func (s *stu) Listen(message string) string {
return s.Name + " 聽 " + message
}
func (s *stu) i() {}
func main() {
message := study.Speak(new(stu))
fmt.Println(message)
}
定義了一個 stu 結構體,這個結構體實作了 Study 介面中的方法,那么上述程式會正常輸出嗎?
不會!
這時會輸出:
./main.go:19:28: cannot use new(stu) (type *stu) as type study.Study in argument to study.Speak:
*stu does not implement study.Study (missing study.i method)
have i()
want study.i()
如果去掉介面中 i(),會正常輸出:聽 abc
小結
以上兩個是讀者在學習代碼的程序中最常問的問題,希望這次能夠幫大家解惑,
另外 option 設計模式,問的也不少,大家可以看下這篇文章:《函式的不定引數你是這樣用嗎?》
推薦閱讀
- 關于分布式事務的理解
- 根據使用者反饋,對開源專案 go-gin-api 新增兩個功能
- 關于處理電商系統訂單狀態的流轉,分享下我的技術方案(附帶原始碼)
- 我是怎么寫 Git Commit message 的?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/293687.html
標籤:Go
