分享
  1. 首页
  2. 文章

GO语言面试系列:(九)golang强制类型转换示例(usafe包)

Chole121 · · 4296 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

题目:

设计父结构体—员工。子结构体:工人,农民,教师,科学家(scientist),服务生。
(1)其中工人,农民,服务生只有基本工资。(10分)
(2)教师除基本工资外,还有课酬(元/天)。(10分)
(3)科学家除基本工资外,还有年终奖。(10分)
编写一个测试结构体,将各种类型的员工的全年工资打印出来。(10分)

代码示例:

package main
import (
 "fmt"
 "unsafe"
)
type Employee struct {
 //基本工资
 BaseWage float64
 eType E_TYPE //员工类型
}
type E_TYPE string
const (
 WORKER E_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()
}

运行结果:


从以上代码中可以看到,我们没有使用接口,给父类绑定一个方法PrintSalary,子类就都可以使用这个方法了,然后在该方法内对父类型强转成了子类型。

感谢作者:波涛澎湃
参考链接:https://www.jianshu.com/p/402c79820fa8?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com

添加小编微信:grey0805,加入知识学习小分队~!


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Chole121

查看原文:GO语言面试系列:(九)golang强制类型转换示例(usafe包)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4296 次点击
1 回复 | 直到 2018年12月06日 10:37:19
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏