設(shè)計父結(jié)構(gòu)體—員工钩杰。子結(jié)構(gòu)體:工人,農(nóng)民,教師,科學(xué)家(scientist),服務(wù)生义钉。
(1)其中工人,農(nóng)民,服務(wù)生只有基本工資。(10分)
(2)教師除基本工資外,還有課酬(元/天)糖耸。(10分)
(3)科學(xué)家除基本工資外,還有年終獎辕万。(10分)
編寫一個測試結(jié)構(gòu)體,將各種類型的員工的全年工資打印出來。(10分)
代碼示例:
package main
import (
"fmt"
"unsafe"
)
type Employee struct {
//基本工資
BaseWage float64
eType E_TYPE //員工類型
}
type E_TYPE string
const (
WORKER E_TYPE = "工人"
FARMER = "農(nóng)民"
TEACHER2 = "老師"
SCIENTIST = "科學(xué)家"
WAITER = "服務(wù)員"
)
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)實例轉(zhuǎn)為子類(Teacher2)實例
//將父類實例轉(zhuǎn)為通用指針
uP := unsafe.Pointer(e)
//再轉(zhuǎn)換為本地 Teacher2 結(jié)構(gòu)體
pT := (*Teacher2)(uP)
//轉(zhuǎn)換完畢儡司,可以輸出子類特有屬性
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("未能匹配到對應(yīng)的員工類型")
}
}
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}}
//實例化農(nóng)民
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
//實例化科學(xué)家
var scientist *Scientist = &Scientist{
Employee{BaseWage: 300, eType: SCIENTIST},
200,
}
//實例化服務(wù)人員
var waiter *Waiter = &Waiter{Employee: Employee{BaseWage: 150, eType: WAITER}}
//測試輸出
worker.PrintSalary()
farmer.PrintSalary()
waiter.PrintSalary()
teacher2.PrintSalary()
scientist.PrintSalary()
}
運行結(jié)果:
image.png
從以上代碼中可以看到娱挨,我們沒有使用接口,給父類綁定一個方法PrintSalary捕犬,子類就都可以使用這個方法了跷坝,然后在該方法內(nèi)對父類型強轉(zhuǎn)成了子類型。