当前位置: 首页 > 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.cnnetsun.cn/news/73744.html

相关文章:

  • 如何快速释放Windows磁盘空间:终极存储分析工具完整指南
  • ComfyUI与Redis缓存集成:加速大规模生成任务
  • HunyuanVideo-Foley离线版发布:支持内网部署与私有化音效生成
  • ComfyUI工作流整合Stable Diffusion 3.5 FP8:实现批量生成高效输出
  • 10、Z变换:原理、计算与应用详解
  • 17、FIR和IIR滤波器的结构与实现
  • Mobile Select移动端滚动选择器深度解析:从基础应用到企业级解决方案
  • 22、IIR滤波器的逐步设计
  • 26、数字滤波器中的有限字长效应及相关知识解析
  • ZonyLrcToolsX 歌词下载工具完全使用手册
  • 4、深入理解BPF Maps:创建、操作与应用
  • 10、深入探索BPF工具:BPFTool与BPFTrace的实用指南
  • 14、XDP 编程:从基础到实践
  • X-TRACK DIY制作全攻略:从零打造个性化GPS自行车码表外壳
  • 火山引擎文档中心上线Qwen-Image-Edit-2509接入指南
  • FLUX.1-dev支持指令微调?多任务学习实践案例分享
  • 6、深入理解Linux USB文件系统:从VFS到usbfs的构建
  • 解决failed to connect to api.anthropic.c错误,转向国产Qwen方案
  • ComfyUI与Cherry Studio协作:打造个性化AI创作空间
  • 终极轨道计算指南:3个实战技巧解析
  • 时区相关的问题,开发如何自测?
  • 城通网盘直链解析神器:三步解锁高速下载新体验
  • 21届智能车赛外延创意:用车载语音指令触发ACE-Step音乐生成
  • 2025年8款AI论文生成器大揭秘,一键极速写超长篇论文,效率提升300%!
  • 还在用留AIGC痕迹的AI写论文?7款免费工具知网维普查重过
  • Wan2.2-T2V-5B模型部署指南:快速搭建你的实时视频生成服务
  • HunyuanVideo-Foley实战教程:使用Git下载并运行视频音效AI
  • 开源不等于免费:ACE-Step商业化路径中GPU算力与Token的定价策略
  • 【直接抄作业】漏洞挖掘典型场景 + 思路(超详细),零基础入门到精通,一篇搞定
  • EasyAdmin8:企业级后台管理系统的完整解决方案