news 2026/4/4 11:39:09

【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/4/3 4:44:33

PyTorch安装与Qwen-Image部署全流程详解(附GPU优化技巧)

PyTorch安装与Qwen-Image部署全流程详解&#xff08;附GPU优化技巧&#xff09; 在生成式AI如火如荼的今天&#xff0c;图像创作已从“能否生成”转向“如何高效、稳定地生成高质量内容”。尤其在广告设计、数字艺术和电商配图等专业领域&#xff0c;用户不再满足于模糊或构图混…

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

浏览器串口助手终极指南:3分钟快速上手零安装串口调试

还在为复杂的串口调试工具安装而烦恼吗&#xff1f;波特律动串口助手作为一款创新的浏览器原生串口工具&#xff0c;让你告别繁琐的驱动配置&#xff0c;直接在浏览器中轻松管理串口设备&#xff01;无论是物联网开发、嵌入式调试还是蓝牙BLE连接&#xff0c;这款工具都能帮你快…

作者头像 李华
网站建设 2026/4/3 6:38:52

NPM Scripts集成LLama-Factory前端监控面板,实时查看训练状态

NPM Scripts集成LLama-Factory前端监控面板&#xff0c;实时查看训练状态 在大模型开发日益普及的今天&#xff0c;越来越多的团队和个人开发者希望快速微调一个属于自己的语言模型——无论是用于客服对话、内容生成&#xff0c;还是内部知识库问答。然而&#xff0c;传统训练流…

作者头像 李华
网站建设 2026/4/1 20:22:34

从3D打印到专业设计:STL转STEP的桥梁工具

从3D打印到专业设计&#xff1a;STL转STEP的桥梁工具 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp &#x1f680; 打破格式壁垒&#xff0c;开启设计新篇章&#xff01; 你是否曾面临这样的…

作者头像 李华
网站建设 2026/4/1 23:44:16

9、卷积与相关性:原理、计算与应用

卷积与相关性:原理、计算与应用 在信号处理领域,卷积和相关性是两个非常重要的概念,它们在许多实际应用中都发挥着关键作用。本文将深入探讨循环相关性、卷积的计算方法以及它们的一些应用,并通过具体的例子进行详细说明。 1. 循环相关性 循环相关性在处理周期性序列时需…

作者头像 李华
网站建设 2026/3/15 20:41:17

translate.js:让网站多语言化像搭积木一样简单

translate.js&#xff1a;让网站多语言化像搭积木一样简单 【免费下载链接】translate Two lines of js realize automatic html translation. No need to change the page, no language configuration file, no API key, SEO friendly! 项目地址: https://gitcode.com/gh_mi…

作者头像 李华