当前位置: 首页 > news >正文

【go语言 | 第3篇】go中类的封装、继承、多态 + 反射

文章目录

  • golang 中类的封装
  • 类的继承
  • 类的多态
  • interface{} 万能数据类型
  • 反射
    • 1. 变量内置 pair 结构
    • 2. 反射 reflect 机制
    • 3. 结构体标签
    • 4. 结构体标签在 Json 中的应用

golang 中类的封装

packagemainimport"fmt"// 类名首字母大写,表示其他包也可以访问typePersonstruct{Namestring// 属性名首字母大写,表示该属性对外能够访问,否则只能类的内部访问AgeintSexstring}func(this*Person)Show(){fmt.Println("姓名:",this.Name,",年龄:",this.Age,",性别:",this.Sex)}func(this*Person)GetName()string{returnthis.Name}func(this*Person)SetName(name string){// this是调用方法对象(指针)this.Name=name}func(thisPerson)SetName2(name string){// this是调用方法对象的一个副本this.Name=name}funcmain(){p:=Person{Name:"张三",Age:18,Sex:"男",}p.Show()fmt.Println("==============================================")p.SetName2("honghong")p.Show()fmt.Println("==============================================")p.SetName("honghong")p.Show()}

注意:go 语言中,类名、属性、方法的首字母是否大写,都与其是否能被外部(其它包)访问有关,否则只能在本包内访问。

类的继承

packagemainimport"fmt"typeHumanstruct{namestringsexstring}func(this*Human)Eat(){fmt.Println("Human Eating...")}func(this*Human)Walk(){fmt.Println("Human Walking...")}// ===========================// 继承:定义 SuperMan 继承自 HumantypeSuperManstruct{// 表示继承自HumanHuman levelint}// 重写 eat 方法func(this*SuperMan)Eat(){fmt.Println("SuperMan Eating...============")}// 增加 Fly 方法func(this*SuperMan)Fly(){fmt.Println("SuperMan Flying...============")}funcmain(){h:=Human{"zhangsan","male"}h.Eat()h.Walk()fmt.Println("============================================================")// 定义子类对象//s := SuperMan {Human{"lisi", "female"}, 2}vars SuperMan s.name="lisi"s.sex="female"s.level=2s.Eat()s.Walk()s.Fly()}

类的多态

packagemainimport"fmt"// interfacetypeAnimalinterface{Sleep()GetColor()stringGetType()string}// 具体的类typeCatstruct{Colorstring}func(this*Cat)Sleep(){fmt.Println("Cat is sleeping")}func(this*Cat)GetColor()string{returnthis.Color}func(this*Cat)GetType()string{return"Cat"}// 具体的类typeDogstruct{Colorstring}func(this*Dog)Sleep(){fmt.Println("Dog is sleeping")}func(this*Dog)GetColor()string{returnthis.Color}func(this*Dog)GetType()string{return"Dog"}funcshowAnimal(animal Animal){fmt.Println(animal.GetType(),animal.GetColor())}funcmain(){// 多态体现:同一个接口类型的变量,可以指向不同的实现类对象varanimal Animal animal=&Cat{"white"}animal.Sleep()animal=&Dog{"black"}animal.Sleep()fmt.Println("==============================================")// 多态体现:cat:=Cat{"white"}dog:=Dog{"black"}showAnimal(&cat)showAnimal(&dog)}

多态的要素:

  1. 有一个接口
  2. 子类要实现接口的所有接口方法,少一个都不行
  3. 父类的引用指向子类的具体数据类型

interface{} 万能数据类型

interface{} 空接口:

  1. int、string、float64… 均实现了 interface{}
  2. 可以用interface{} 类型代表任何数据类型

interface 用于类型断言

packagemainimport"fmt"// interface{} 作为万能数据类型funcmyFun(argsinterface{}){fmt.Println("myFun!")fmt.Println(args)// 提供 interface{} 类型断言value,ok:=args.(string)if!ok{fmt.Println("args is not string")}else{fmt.Println("args is string")fmt.Println("value = ",value)}}funcmain(){myFun(11)fmt.Println("====================================")myFun("hello")fmt.Println("====================================")myFun(true)fmt.Println("====================================")myFun(1.234)}

反射

1. 变量内置 pair 结构


反射是通过 pair 结构来得到 type。

2. 反射 reflect 机制

通过 reflect 包动态获取 type 和 value:

e.g.1

packagemainimport("fmt""reflect")funcPrintNum(arginterface{}){fmt.Println("type is: ",reflect.TypeOf(arg))fmt.Println("value is: ",reflect.ValueOf(arg))}funcmain(){varnumfloat64=1.235PrintNum(num)}

e.g.2

packagemainimport("fmt""reflect")typeUserstruct{IdintNamestringAgeint}func(this User)Call(){fmt.Println("user call...")}funcmain(){u:=User{1,"honghong",18}PrintFieldsAndValues(u)}funcPrintFieldsAndValues(inputinterface{}){// 获取 input 的typeinputtype:=reflect.TypeOf(input)fmt.Println("inputtype is: ",inputtype)// 获取 input 的valueinputvalue:=reflect.ValueOf(input)fmt.Println("inputvalue is: ",inputvalue)fmt.Println("==========================================================")// 通过 type 获取里面的字段// 1. interface获取 type,通过 type 获取 NumFields, 遍历字段// 2. 得到每个 field,数据类型// 3. 通过 field 有一个 Interface() 方法得到 valuefori:=0;i<inputtype.NumField();i++{field:=inputtype.Field(i)value:=inputvalue.Field(i).Interface()fmt.Printf("%v: %s = %v\n",field.Type,field.Name,value)}fmt.Println("==========================================================")// 通过 type 获取方法fori:=0;i<inputtype.NumMethod();i++{method:=inputtype.Method(i)fmt.Printf("%s: %v\n",method.Name,method.Type)}}

3. 结构体标签

packagemainimport("fmt""reflect")typeresumestruct{Namestring`info:"name" doc:"我的名字"`sexstring`info:"sex" doc:"性别"`}funcPrintTag(datainterface{}){t:=reflect.TypeOf(data).Elem()fori:=0;i<t.NumField();i++{tagInfo:=t.Field(i).Tag.Get("info")tagDoc:=t.Field(i).Tag.Get("doc")fmt.Println("tag info:",tagInfo," tag doc:",tagDoc)}}funcmain(){varr resumePrintTag(&r)}

4. 结构体标签在 Json 中的应用

packagemainimport("encoding/json""fmt")typeMoviestruct{Titlestring`json:"title"`Yearint`json:"year"`Pricefloat64`json:"rmb"`Actors[]string`json:"actors"`}funcmain(){movie:=Movie{"唐顿庄园",2000,9.5,[]string{"tom","jerry","lucy"}}// 编码 movie 结构体————> jsonjsonStr,err:=json.Marshal(movie)iferr!=nil{fmt.Println("json.Marshal err:",err)return}fmt.Printf("%s\n",jsonStr)// 解码 json ————> movie 结构体myMovie:=Movie{}err=json.Unmarshal(jsonStr,&myMovie)iferr!=nil{fmt.Println("json.Unmarshal err:",err)return}fmt.Printf("%v\n",myMovie)}

http://www.jsqmd.com/news/95766/

相关文章:

  • 虚拟零售中AI架构的多语言支持:如何适应全球化市场?
  • 零基础入门Stable Diffusion 3.5 FP8:手把手教你完成Python安装配置
  • 【PMSG风力涡轮机建模】基于直驱永磁同步发电机(PMSG)的1.5MW风力发电机的详细建模(Simulink仿真实现)
  • Android Studio开发APP接入ACE-Step音乐API:移动端创作新体验
  • k230 Pyhton三角形识别
  • 终极右键菜单优化利器:ContextMenuManager完全使用手册
  • 年营收2000亿电商,3370万用户信息泄露,CEO引咎辞职
  • 终极网站下载工具:5分钟学会整站备份与离线浏览
  • 如何快速释放Windows磁盘空间:终极存储分析工具完整指南
  • 基于OpenSpec标准构建:HunyuanVideo-Foley API设计规范公开
  • 20、数字 FIR 滤波器的逐步设计
  • 3分钟学会原神帧率解锁:告别卡顿的终极优化指南
  • Driver Store Explorer终极指南:轻松管理Windows驱动存储库
  • 一键升级 OpenSSH 10到最新版:告别手工编译、兼容国产系统、批量部署无忧!
  • 22、IIR滤波器的逐步设计
  • 23、IIR滤波器的逐步设计与不同类型滤波器的特性分析
  • 9、卷积与相关性:原理、计算与应用
  • 10、Z变换:原理、计算与应用详解
  • 11、Z变换与差分方程求解全解析
  • 12、离散系统差分方程求解与信号处理相关问题解析
  • 13、离散时间傅里叶变换与离散傅里叶变换详解
  • 14、离散时间傅里叶变换与离散傅里叶变换详解
  • 4、深入理解BPF Maps:创建、操作与应用
  • 5、BPF 映射操作与类型详解
  • 6、BPF 映射类型与虚拟文件系统使用指南
  • 终极广告拦截方案:AdGuardHomeRules 完整使用指南
  • 智能自动化工具:重新定义百度网盘提取码获取体验
  • 近红外光谱开源数据集:快速上手与实战应用完整指南
  • 5分钟精通!ColorUI导航组件让界面切换效率提升300%
  • Midieditor实战突破:解锁专业级MIDI编辑新境界