先定義一個內部呼叫介面 用於後面的注入
// 被 注入的介面 type UserFace interface { Get() string Set() string }
然後定義一個 Struct ,開啟建構函式,並實現 上面的 介面
type SysUser struct { Name string } // User的建構函式 func NewSysUser(Name string) *SysUser { return &SysUser{Name: Name} } // 實現介面 UserFace func (u *SysUser) Get() string { return "SysUser.Get" } // 實現介面 UserFace func (u *SysUser) Set() string { return "SysUser.Set" }
定義一個對 外部 (main 或者是 gin可以直接 呼叫的)呼叫介面
type MyFace interface { Sum(a int, b int) int }
然後 定義外部Struct 用於實現上面的 外部 呼叫介面,並且 注入內部呼叫介面UserFace
// 定義結構體 並注入 UserFace type MyStruct struct { UserFace UserFace // 注入 UserFace } // MyStruct建構函式 func NewMyStruct(face UserFace) *MyStruct { return &MyStruct{ UserFace: face, // 注入 SysUser 系統使用者 } } // 實現介面 MyFace func (ms *MyStruct) Sum(a int, b int) int { getval := ms.UserFace.Get() // 呼叫 注入的 UserFace 的Get方法 setVal := ms.UserFace.Set() // 呼叫 注入的 UserFace 的Set方法 fmt.Println("MyStuct呼叫了UserFace Get: ", getval) fmt.Println("MyStuct呼叫了UserFace Set: ", setVal) return a + b }
Main 使用 (注意:不能face.UserFace.Get() 這麼調,因為UserFace是介面型別,只能在實現 MyFace 介面並注入 UserFace的 MyStruct 裡呼叫 )
func main() { sysUser := NewSysUser("張三") // 定義注入實體 var face MyFace = NewMyStruct(sysUser) // 定義 外部 介面型別 並將實體注入 result := MyFace.Sum(face, 1, 2) // 呼叫外部介面方法 fmt.Println(result) //face.UserFace.Get() // 注意 不能這麼調,因為UserFace是介面型別 }