golang強制型別轉換示例(usafe包)
設計父結構體—員工。子結構體:工人,農民,教師,科學家(scientist),服務生。
(1)其中工人,農民,服務生只有基本工資。(10分)
(2)教師除基本工資外,還有課酬(元/天)。(10分)
(3)科學家除基本工資外,還有年終獎。(10分)
編寫一個測試結構體,將各種型別的員工的全年工資打印出來。(10分)
程式碼示例:
package main import ( "fmt" "unsafe" ) type Employee struct { //基本工資 BaseWage float64 eTypeE_TYPE //員工型別 } type E_TYPE string const ( WORKERE_TYPE = "工人" FARMER= "農民" TEACHER2= "老師" SCIENTIST= "科學家" WAITER= "服務員" ) type Worker struct { Employee } func (e *Employee) getYearBaseSalary() float64 { return 12 * e.BaseWage } func (e *Employee) PrintSalary() { fmt.Printf("%s全年工資:", e.eType) switch e.eType { case WORKER: fallthrough case FARMER: fallthrough case WAITER: fmt.Printf("%.2f\n", e.BaseWage) case TEACHER2: //下面使用unsafe包的Pointer將父類(Employee)例項轉為子類(Teacher2)例項 //將父類例項轉為通用指標 uP := unsafe.Pointer(e) //再轉換為本地 Teacher2 結構體 pT := (*Teacher2)(uP) //轉換完畢,可以輸出子類特有屬性 fmt.Println("測試-->老師的課酬是:", pT.ClassRemuneration) fmt.Printf("%.2f\n", e.getYearBaseSalary()+pT.ClassRemuneration) case SCIENTIST: uP := unsafe.Pointer(e) pT := (*Scientist)(uP) fmt.Printf("%.2f\n", e.getYearBaseSalary()+pT.YearEndBonus) default: fmt.Println("未能匹配到對應的員工型別") } } type Farmer struct { Employee } type Teacher2 struct { Employee //課酬 (元/天) ClassRemuneration float64 } type Scientist struct { Employee //年終獎 YearEndBonus float64 } type Waiter struct { Employee } //----------------測試------------------------ func main() { //例項化工人 var worker *Worker = &Worker{Employee: Employee{BaseWage: 120, eType: WORKER}} //例項化農民 var farmer *Farmer = &Farmer{ Employee: Employee{ BaseWage: 150, eType:FARMER, }, } //例項化老師 employee := &Employee{BaseWage: 250, eType: TEACHER2} var teacher2 *Teacher2 = &Teacher2{Employee: *employee} teacher2.ClassRemuneration = 500 //例項化科學家 var scientist *Scientist = &Scientist{ Employee{BaseWage: 300, eType: SCIENTIST}, 200, } //例項化服務人員 var waiter *Waiter = &Waiter{Employee: Employee{BaseWage: 150, eType: WAITER}} //測試輸出 worker.PrintSalary() farmer.PrintSalary() waiter.PrintSalary() teacher2.PrintSalary() scientist.PrintSalary() }
執行結果:

image.png
從以上程式碼中可以看到,我們沒有使用介面,給父類繫結一個方法PrintSalary,子類就都可以使用這個方法了,然後在該方法內對父型別強轉成了子型別。