golang學習--go中'繼承'和多態


  golang中沒有繼承的概念,這個struct屬性上的繼承,但是可以用匿名字段來模擬這個過程,方法上面的繼承要使用接口.多態可以通過接口實現.可以看一下代碼.

package main
import (
   "encoding/json"
   "fmt"
)
//抽象接口
type ISubUser interface {
   Delete() string
   Get()  string
}
type User struct {
   Lang      string    `json:"lang" gorm:"type:varchar(16)"`     // 語言類型
   ISubUser `json:"-"`
}

type PermanentUser struct{
   Key       uint64 `json:"key123" gorm:"primary_key"` // 主鍵:索引
   User
}
func (paste *PermanentUser) Delete() string {
   return "PermanentUser is Delete"
   //return db.Delete(&paste, "`key` = ?", paste.Key).Error
}
// 成員函數,訪問
func (paste *PermanentUser) Get() string {
   return "PermanentUser is Get"
   //return db.Find(&paste, "`key` = ?", paste.Key).Error
}

type TemporaryUser struct{
   Key       uint64 `json:"key456" gorm:"primary_key"` // 主鍵:索引
   User
}
// 成員函數,刪除
func (paste *TemporaryUser) Delete() string {
   return "TemporaryUser is Delete"
   //return db.Delete(&paste, "`key` = ?", paste.Key).Error
}
// 成員函數,查看
func (paste *TemporaryUser) Get() string {
   return "TemporaryUser is Get"
   //return db.Find(&paste, "`key` = ?", paste.Key).Error
}

func testGetPolymorphism(u ISubUser){
   fmt.Println(u.Get())
}
func testDetelePolymorphism(u ISubUser) {
   fmt.Println(u.Delete())
}

func main(){
   //繼承
   Puser:=&PermanentUser{Key:123,User:User{Lang:"asd"}}
   jsonstring,_:=json.Marshal(Puser)
   fmt.Println(string(jsonstring))
   fmt.Println()
   Tuser:=&TemporaryUser{Key:456,User:User{Lang:"zxc"}}
   jsonstring,_=json.Marshal(Tuser)
   fmt.Println(string(jsonstring))
   fmt.Println("-------------------------")

   //多態--上轉型
   testGetPolymorphism(Puser)
   testDetelePolymorphism(Puser)
   testGetPolymorphism(Tuser)
   testDetelePolymorphism(Tuser)
   fmt.Println("----------------------")

   //多態--下轉型
   user:=&User{Lang:"asd"}
   user.ISubUser=&PermanentUser{}
   fmt.Println(user.Get())
   fmt.Println(user.Delete())
   jsonstring,_=json.Marshal(user)
   fmt.Println(string(jsonstring))
   fmt.Println()
   user.ISubUser=&TemporaryUser{}
   fmt.Println(user.Get())
   fmt.Println(user.Delete())
   jsonstring,_=json.Marshal(user)
   fmt.Println(string(jsonstring))
   fmt.Println()
}
實例

有幾點需要說明的

  1.初始化的時候一定要指明變量屬性的字段,不然編譯不通過,會一直說什么參數過少.

  2.父類所帶接口要記得`json:"-"`,這樣在轉換從json的時候不會帶着接口

  3.父類接口用於下轉型,如果用不帶下轉型,那么可以不用寫上.

 

最近比較忙,粗略的寫了一下,以后再慢慢細化......

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM