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

go面向对象

继承 封装 多态

定义结构体

//定义老师的结构体
type Teacher struct {Name   stringAge    intSchool string
}func main() {var t1 Teacherfmt.Println(t1)t1.Name = "tom"t1.Age = 20t1.School = "school"fmt.Println(t1)
}

结构体实例的创建

package mainimport "fmt"//定义老师的结构体
type Teacher struct {Name   stringAge    intSchool string
}func main() {var t1 Teacherfmt.Println(t1)t1.Name = "tom"t1.Age = 20t1.School = "school"fmt.Println(t1)var t2 Teacher = Teacher{"liu", 32, "rrr"}fmt.Println(t2)//指针*var t *Teacher = new(Teacher)//t是指针 t其实指向的就是地址 应该给这个地址的执行的对象的字段赋值(*t).Name = "ma"(*t).Age = 23t.School = "daxue"fmt.Println(t)var t6 *Teacher = &Teacher{"sa", 46, "eda"}fmt.Println(t6)
}

//指针*

结构值之间的转换

方法 行为

package mainimport "fmt"//定义Person结构体
type Person struct {Name string
}func (p Person) test() {fmt.Println(p.Name)
}
func main() {//创建结构体对象var p Personp.Name = "tom"p.test()
}

改变值

package mainimport "fmt"//定义Person结构体
type Person struct {Name string
}func (p Person) test() {fmt.Println(p.Name)
}//*是指针
func (p *Person) test01() {fmt.Println()fmt.Println((*p).Name)
}
func main() {//创建结构体对象var p Personp.Name = "tom"p.test()p.Name = "sasa"fmt.Printf("p的地址为:%p \n", &p)(&p).test()fmt.Println(p)
}

改变值用指针

package mainimport "fmt"type interger intfunc (i interger) print() {fmt.Println("i= ", i)
}func (i *interger) print01() {(*i) = 30fmt.Println("i=", *i)
}
func main() {var i interger = 20i.print()fmt.Println(i)var i01 interger = 5i01.print01()fmt.Println("i01=", i01)
}

其他包被访问用大写

toString

package mainimport "fmt"type Student struct {Name stringAge  int
}func (s Student) toString() string {str := fmt.Sprintf("Name = %v, Age = %v", s.Name, s.Age)return str
}
func (s *Student) toString2() string {str := fmt.Sprintf("Name = %v, Age = %v", s.Name, s.Age)return str
}func main() {stu := Student{Name: "tom",Age:  20,}fmt.Println(stu)fmt.Println(&stu)
}

方法和函数的区别

import "fmt"type Student struct {Name string
}//定义方法必须定义指定的类型
func (s Student) test01() {fmt.Println(s.Name)
}//定义函数
func method01(s Student) {fmt.Println(s.Name)
}
func main() {//调用函数var s Student = Student{"tom"}method01(s)//方法调用s.test01()
}

函数定义的是指针必须传递的是指针,函数定义的是值传递 必须是值类型

package mainimport "fmt"type Student struct {Name string
}//定义函数
func method01(s Student) {fmt.Println(s.Name)
}func method02(s *Student) {fmt.Println((*s).Name)
}
func main() {//函数定义的是指针必须传递的是指针//函数定义的是值传递 必须是值类型var s Student = Student{"tom"}method01(s)method02(&s)
}

对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型

package mainimport "fmt"type Student struct {Name string
}//定义方法
func (s Student) test01() {fmt.Println(s.Name)
}
func (s *Student) test02() {fmt.Println((*s).Name)
}func main() {var s Student = Student{"yy"}s.test01()//虽然用指针类型调用,但是传递还是安装值传递的形式(&s).test01()(&s).test02()s.test02()
}

创建结构体实例时指定字段值

返回值的

跨包的使用

package kua01type Student struct {Name string
}package mainimport ("encoding/json""fmt""testgo/oop/kuabaonew/kua01"
)func main() {//跨包创建结构体student实例var s kua01.Student = kua01.Student{Name: "tom"}fmt.Println(s)var js, _ = json.Marshal(s)jsonStr := string(js)fmt.Println("将结构体转json:--->>" + jsonStr)st := kua01.Student{Name: "red"}fmt.Println(st)var stjson, _ = json.Marshal(st)jsonstr := string(stjson)fmt.Println(jsonstr)var student kua01.Studenterr := json.Unmarshal([]byte(jsonstr), &student)if err != nil {fmt.Printf("unmarshal err=%v\n", err)}fmt.Printf("反序列化后student=%#v student.Name=%v \n", student, student.Name)}

结构体tag

package mainimport ("encoding/json""fmt"
)type Student struct {ID     intGender stringName   string
}type Class struct {Title   stringStudent []Student
}func main() {c := &Class{Title:   "001",Student: make([]Student, 0, 200),}for i := 0; i < 10; i++ {stu := Student{Name:   fmt.Sprintf("stu%02d", i),Gender: "男",ID:     i,}c.Student = append(c.Student, stu)}data, err := json.Marshal(c)if err != nil {fmt.Println("json marshal failed")return}fmt.Printf("json:%s \n", data)str := `{"Title":"001","Student":[{"ID":0,"Gender":"男","Name":"stu00"},{"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}`c1 := &Class{}err0 := json.Unmarshal([]byte(str), c1)if err0 != nil {fmt.Println("json unmarshal failed!")return}fmt.Printf("%#v\n", c1)
}

工厂模式的创建

package factory01type student struct {Name stringAge  int
}//工厂模式
func NewStudent(n string, a int) *student {return &student{n, a}
}
package mainimport ("encoding/json""fmt""testgo/oop/factory/factory01"
)func main() {//跨包创建结构体Student的实例s := factory01.NewStudent("tom", 20)data, _ := json.Marshal(s)jsonStr := string(data)fmt.Printf("json ", jsonStr)
}

相关文章:

  • 软件杯 深度学习 机器视觉 人脸识别系统 - opencv python
  • Leetcode的使用方法
  • 深入解析代理模式:使用场景、实现及应用实例
  • Nextcloud激活被锁用户
  • 深入了解 Flutter 中多种预定义的 Physics 类
  • ideaSSM 学员信息管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目
  • 社交媒体的未来:探讨Facebook的发展趋势
  • scala05-函数式编程02
  • C语言中常用的文件操作
  • Mysql数据库——高级SQL语句补充
  • 等级保护测评无补偿因素的高风险安全问题判例(共23项需整改)
  • 操作系统理论 第四章(存储器管理)—第一节(存储器的层次结构)
  • 笔记82:关于 C++ 中的 swap 函数
  • 电子模拟卷1
  • V R元宇宙平台的未来方向|V R主题馆加 盟|游戏体验馆
  • JavaScript-如何实现克隆(clone)函数
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android Volley源码解析
  • Android交互
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES6 学习笔记(一)let,const和解构赋值
  • javascript从右向左截取指定位数字符的3种方法
  • Phpstorm怎样批量删除空行?
  • vuex 笔记整理
  • 从tcpdump抓包看TCP/IP协议
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 解决iview多表头动态更改列元素发生的错误
  • 解析带emoji和链接的聊天系统消息
  • 每天10道Java面试题,跟我走,offer有!
  • 前言-如何学习区块链
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 双管齐下,VMware的容器新战略
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (1)bark-ml
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (Git) gitignore基础使用
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (ibm)Java 语言的 XPath API
  • (pojstep1.3.1)1017(构造法模拟)
  • (翻译)terry crowley: 写给程序员
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • .jks文件(JAVA KeyStore)
  • .Net mvc总结
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 使用配置文件
  • .NET的数据绑定