news 2026/9/22 5:40:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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)}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 17:37:26

如何快速释放Windows磁盘空间:终极存储分析工具完整指南

您的Windows电脑是否经常提示"磁盘空间不足"&#xff1f;是否曾为寻找那些占用大量空间的神秘文件而烦恼&#xff1f;今天就为您介绍一款能够彻底解决这些问题的专业磁盘管理工具&#xff0c;让您轻松掌握磁盘使用情况&#xff0c;快速释放宝贵空间。 【免费下载链接…

作者头像 李华
网站建设 2026/9/21 11:41:28

ComfyUI与Redis缓存集成:加速大规模生成任务

ComfyUI与Redis缓存集成&#xff1a;加速大规模生成任务 在AI内容生成从“能用”迈向“好用、高效、可量产”的今天&#xff0c;一个看似不起眼的技术组合正在悄然改变工作流的运行效率——ComfyUI 与 Redis 的深度集成。当可视化节点图遇见内存级缓存系统&#xff0c;原本耗时…

作者头像 李华
网站建设 2026/9/22 3:05:42

HunyuanVideo-Foley离线版发布:支持内网部署与私有化音效生成

HunyuanVideo-Foley离线版发布&#xff1a;支持内网部署与私有化音效生成 在影视后期、短视频工厂乃至军事仿真系统中&#xff0c;一段精准的脚步声可能比画面本身更能传递紧张氛围。然而长期以来&#xff0c;这类细节音效的制作始终依赖人工“Foley录音”——演员在录音棚里模…

作者头像 李华
网站建设 2026/9/22 9:39:50

ComfyUI工作流整合Stable Diffusion 3.5 FP8:实现批量生成高效输出

ComfyUI工作流整合Stable Diffusion 3.5 FP8&#xff1a;实现批量生成高效输出 在AIGC内容生产逐渐从“创意实验”迈向“工业流水线”的今天&#xff0c;一个核心挑战日益凸显&#xff1a;如何在不牺牲图像质量的前提下&#xff0c;让像Stable Diffusion这样的大模型跑得更快、…

作者头像 李华
网站建设 2026/9/21 21:12:32

10、Z变换:原理、计算与应用详解

Z变换:原理、计算与应用详解 1. 引言 在信号处理应用中,拉普拉斯变换和傅里叶变换起着重要作用,它们分别定义在连续时间域和离散时间域。在实际信号处理里,我们更多使用的是傅里叶变换和拉普拉斯变换的离散版本,即离散时间傅里叶变换、离散傅里叶变换以及更为常用的Z变换…

作者头像 李华
网站建设 2026/9/22 8:39:40

17、FIR和IIR滤波器的结构与实现

FIR和IIR滤波器的结构与实现 1. FIR滤波器的快速卷积形式 FIR滤波器的快速卷积形式是一种高效的实现方法。其基本步骤如下: 1. 将输入序列分段成块。 2. 对每个块进行快速傅里叶变换(FFT)。 3. 对滤波器系数 (h(n)) 进行快速傅里叶变换。 4. 将每个块的FFT结果 (X_i(k…

作者头像 李华