news 2026/8/10 3:34:15

【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/8/10 0:29:55

智能家居自动化终极指南:从零搭建完整的AI控制中心

在当今数字化时代&#xff0c;智能家居自动化已成为提升生活品质的重要途径。本指南将带您从零开始&#xff0c;构建一个功能完整的AI控制中心&#xff0c;实现家居设备的智能化管理和自动化控制。 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 …

作者头像 李华
网站建设 2026/8/10 1:25:18

【强化学习实验】- 策略梯度算法

1.实验内容 策略梯度算法文章中2.2 策略梯度算法。 通俗总结 ① 优胜劣汰 ② 学如逆水行舟&#xff0c;不进则退。 2.实验目标 2.1 构建策略模型 class PolicyNet(torch.nn.Module):def __init__(self, state_dim, hidden_dim, action_dim):super(PolicyNet, self).__init…

作者头像 李华
网站建设 2026/8/8 3:07:55

揭秘LLama-Factory底层架构:如何统一支持LLaMA/Qwen/Baichuan等模型

揭秘LLama-Factory底层架构&#xff1a;如何统一支持LLaMA/Qwen/Baichuan等模型 在大语言模型&#xff08;LLM&#xff09;快速演进的今天&#xff0c;一个现实问题摆在开发者面前&#xff1a;为什么微调一个模型要写一套代码&#xff0c;换另一个就得重来&#xff1f;明明都是…

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

Qwen-Image专业级图像生成模型支持1024×1024输出

Qwen-Image&#xff1a;专业级图像生成的技术跃迁 在广告公司加班到深夜的设计师&#xff0c;正为一个融合东方美学与未来科技感的品牌视觉方案焦头烂额。客户要求“青花瓷色调的赛博朋克风格”&#xff0c;还要加入书法元素和动态光影。过去&#xff0c;这可能需要数轮手绘草图…

作者头像 李华
网站建设 2026/8/9 6:37:56

PID调试技巧:定位HunyuanVideo-Foley运行时进程卡顿问题

PID调试技巧&#xff1a;定位HunyuanVideo-Foley运行时进程卡顿问题 在AI驱动的视频内容生产链条中&#xff0c;音效生成正从“人工精修”迈向“自动合成”。腾讯混元团队推出的 HunyuanVideo-Foley 正是这一趋势下的代表性系统——它能根据视频画面自动生成脚步声、碰撞声、环…

作者头像 李华
网站建设 2026/8/7 18:31:51

ENSP下载官网类比:获取可信源的FLUX.1-dev模型分发渠道推荐

FLUX.1-dev 模型分发渠道推荐&#xff1a;如何像获取 ENSP 官方镜像一样安全下载可信 AI 模型 在人工智能生成内容&#xff08;AIGC&#xff09;迅速普及的今天&#xff0c;越来越多开发者和研究人员开始尝试部署高性能文生图模型。然而&#xff0c;一个常被忽视却至关重要的问…

作者头像 李华