go語言 接口 interface{}

package main

import (
   "fmt"
   "io"
)

//接口聲明格式
/*
*   type 接口類型 interface{
         方法名1(參數)(返回值)
         方法名2(參數)(返回值)
    }
接口類型名 使用type將接口定義爲自定義的類型名  接口在命名時 一般會在單詞後面加 er
如有操作的接口就是 Writer 如有字符串功能的接口就是 Stringer  有關閉功能的接口 Closer
方法名 當方法名首字母大寫時 且這個接口類型名首字母也是大時這個接口可以被接口所在的包(package)之外訪問
*/

//參數列表、返回值列表:參數列表和返回值列表中的參數變量名可以被忽略,例如:
type writer interface {
   Writer([]byte) error
}

//開發中常見的接口及寫法
type Writer2 interface {
   Writer([]byte) (n int, err error)
}

//類似 將一個對象以字符串形式展現的接口
type Stringer interface {
   String() string
}

//接口被實現的條件有兩種
// 1.接口的方法與實現接口的類型方法格式一致
// 2.接口中所有方法均被實現
//在類型中添加與接口簽名一致的方法就可以實現該方法
//簽名包括方法中的名稱 參數列表 返回值列表
//也就是說 只要實現接口類型中的方法的名稱參數列表返回值列表中的任意一項與接口要實現的方法不一致,那麼接口的這個方法就不會被實現

//爲了抽象數據寫入的過程,定義 DataWriter 接口來描述數據寫入需要實現的方法,接口中的 WriteData() 方法表示將數據寫入,寫入方無須關心寫入到哪裏。
//實現接口的類型實現 WriteData 方法時,會具體編寫將數據寫入到什麼結構中。這裏使用file結構體實現 DataWriter 接口的 WriteData 方法,
//方法內部只是打印一個日誌,表示有數據寫入,詳細實現過程請參考下面的代碼。

//定義一個數據寫入器
type DataWriter interface {
   WriteData(data interface{}) error
   // 能否寫入  如果這個沒有被實現就會報錯
   CanWrite() bool
}

//定義文件結構 用於實現DataWriter
type file struct {
}

// 實現DataWriter接口的WriteData方法
func (d *file) WriteData(data interface{}) error {
   // 模擬寫入數據
   fmt.Println("WriteData:", data)
   return nil
}

func (c *file) CanWrite() bool {
   return true
}

//類型 與接口的關係
//類型和接口之間有一對多和多對一的關係
//一個類型可實現多個接口
//網絡上的兩個程序通過一個雙向的通信連接實現數據的交換
//連接的一端稱爲socket socket同時能讀取和寫入數據
type Socket struct {
}

func (s *Socket) Write(p []byte) (n int, err error) {
   return 0, nil
}
func (s *Socket) Close() error {
   return nil
}

//定義接口
type Writer interface {
   Write(p []byte) (n int, err error)
}
type Closer interface {
   Close()
}

// 使用io.Writer2的代碼, 並不知道Socket和io.Closer的存在
func usingWriter(writer io.Writer) {
   writer.Write(nil)
}

// 使用io.Closer, 並不知道Socket和io.Writer的存在
func usingCloser(closer io.Closer) {
   closer.Close()
}

//多個類型實現相同的接口
type Service interface {
   Start()     // 開啓服務
   Log(string) // 日誌輸出
}

//日誌
type Logger struct {
}

// 實現Service的Log()方法
func (g *Logger) Log(l string) {

   fmt.Println(l)
}

// 遊戲服務
type GameService struct {
   Logger // 嵌入日誌器
}

// 實現Service的Start()方法
func (g *GameService) Start() {
}
func main() {

   //實例化
   f := new(file)
   // 聲明一個DataWriter的接口
   var writer DataWriter
   // 將接口賦值f,也就是*file類型
   writer = f
   // 使用DataWriter接口進行數據寫入
   writer.WriteData("data")
   writer.CanWrite()

   // 實例化Socket
   s := new(Socket)
   usingWriter(s)
   usingCloser(s)

   Service := new(GameService)
   Service.Start()
   Service.Log("hello Json")

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章