继承复习-go(代码片段)

旧时星空 旧时星空     2022-12-12     509

关键词:

继承

通过在结构体中嵌套实现继承,且继承的只是结构体的属性,若要继承方法可以通过实现接口达成

接口

多态

在golang中interface相当于类,struct相当于对象,当struct重写了interface的方法就是struct继承了interface类的方法,interface没有属性所以struct有属性没有方法,通过struct重写interface的方法实现类和对象的编程

在interface中同样的方法,不同的struct重写,导致不同的struct的实例同一方法结果不同从而实现多态

      f,_:=os.Open("D:/go.txt") //打开文件,得到一个文件指针
      fileInfo,_:=f.Stat()       //Stat()函数得到文件的信息
      b:=make([]byte,fileInfo.Size())//创建一个文件字节长度的byte数组用于存储从文件读出的内容
      f.Read(b)//将文件的内容读出到byte数组中
      fmt.Println("内容:",string(b))//将内容转为string输出

输出

filePath:="D:/go.txt"  //os包是用来操作系统文件夹以及系统文件的,所以用os.Open()d
	f,err:=os.OpenFile(filePath,os.O_APPEND,0660)//打开,判断是否存在该文件,若不存在则返回错误信息
	defer f.Close()//每次文件的打开要记得关闭流,即打开就有关闭
	if err!=nil
		f,_:=os.Create("D:/go.txt")//在文件不存在时创建文件
	
	f.Write([]byte("输入内容123"))//创建一个byte数组,将其中的内容输入到文件中
	f.WriteString("\\r\\n再一次的输入")//输出到文件中的内容即string,更为方便,不用创建byte数组
	fmt.Println("程序结束")

在对本地文件进行输出时,即程序将内容写入到本地文件中,先判断指定路径下的本地文件是否存在。

ioutil包

f,_:=os.Open("D:/go.txt")
b,_:=ioutil.ReadAll(f)//读取文件内容
fmt.Println(string(b))// hello world

等同于

b,_:=ioutil.ReadFile("D:/go.txt")
fmt.Println(string(b))

写入

ioutil.WriteFile("D:/go.txt",[]byte("这是写入的数据"),0666)
fmt.Println("写入数据")

由原来的hello world 变为 这是写入的数据

但是该方式只能先清除原有文件的内容再写入数据

Xml文件的读取

xml文件内容如下

标签之内为一组数据,即一个结构体变量的数据,其中age,hobby,place为结构体中成员变量

<?xml version="1.0" encoding="UTF-8" ?>
<people id="666" >
    <age>18</age>
    <hobby>打篮球</hobby>
    <place>图书馆</place>
</people>

如下是结构体的内容

在每一行的最右边可以看到有标记对应于xml文件的各个标签,读取xml文件内容时是按对应关系读取的,即结构体中的每个成员变量由xml标记对应到xml文件的对应标签的数据

type Student struct
	XMLName xml.Name `xml:"people"`//对应people标签
	Id int           `xml:"id,attr"`//对应people标签里的id属性
	Age int          `xml:"age"`  //对应people标签下的age标签
	Hobby string      `xml:"hobby"`
	Place string      `xml:"place"`

一下是主函数的实现对xml文件的数据的读取

func main()
	stu:=new(Student)  //创建一个Student结构体对象或者说结构体变量其中又有成员变量,如age,place等
	s,_:=ioutil.ReadFile("cemo.xml")  //ioutil读取相对路径下的xml文件
	xml.Unmarshal(s,stu)  //使用xml的方法Unmarshal解析在struct里的标记对应的反射reflect得到数据给stu对象
	fmt.Println(stu)  打印数据

生成xml文件

在程序中用已存有数据的结构体变量生成对应的xml文件

    stu:=StudentId:122,Age:22,Hobby:"刷剧",Place:"宿舍"//创建结构体变量并赋初值
	b,_:=xml.MarshalIndent(stu,"","	")//生成xml内容,第二个参数是每行标签前面隔开的形式,第三个是子标签的隔开形式,这里是tab
	b=append([] byte(xml.Header),b...)//在没有这行代码时,xml文件里没有文件头即xml文件的版本以及编码方式
	ioutil.WriteFile("D:/Student.xml",b,0777)//将生成的xml内容输入到本地路径下的文件中
	fmt.Println("执行结束")

使用go的协程可以实现并发,在这里gorutine可以创建多个窗口实现并发

	var wg sync.WaitGroup//
	wg.Add(5)//等待组内计数器加数字
	for i:=0;i<5;i++
		go func()
			time.Sleep(10e9)
			fmt.Println("第",i,"次执行")
			wg.Done()//每次操作借宿计数器数字-1
		()
	
	wg.Wait()//阻塞
	fmt.Println("程序借结束")

sync.WaitGroup等待组内部拥有一个计数器,计数器的值可以通过方法调用实现计数器的增加和减少。当我们添加了 N 个并发任务进行工作时,就将等待组的计数器值增加 N。每个任务完成时,这个值减 1。同时,在另外一个 goroutine 中等待这个等待组的计数器值为 0 时,表示所有任务已经完成。

互斥锁

提高并发时访问数据的安全性

代码同一时间只有一个人gorutine运行

var(
	num=100
    wg sync.WaitGroup
	m sync.Mutex//先声明
)
func demo()
	m.Lock()//锁
	for i:=0;i<10;i++
		num=num-1
	
	m.Unlock()//解锁
	wg.Done()

func main()
	wg.Add(10)
	for i:=0;i<10;i++
		go demo()
	
	wg.Wait()
	fmt.Println(num)
	fmt.Println("程序结束")

读写锁

表示在锁住的代码范围内数据的读写操作

func main()
	var rwm sync.RWMutex
	var wg sync.WaitGroup
	wg.Add(10)
	m:=make(map[int]int)
	for i:=0;i<10;i++
		go func(j int)
			rwm.Lock()
			m[j] =j
			fmt.Println(m)
			rwm.Unlock()
			wg.Done()
		(i )
	
	wg.Wait()
	fmt.Println("程序结束")

channel实现通信和同步

ch1:=make(chan string)//实现协程间的通信
	ch2:=make(chan int)//实现子协程的同步
	go func()
		ch1 <- "传送给另一个协程的数据"
		ch2 <-1
	()
	go func()
		content:=<- ch1
		fmt.Println("取出数据成功",content)
		ch2 <-2
	()
	<-ch2
	<-ch2
	fmt.Println("程序结束")
//输出
//取出数据成功 传送给另一个协程的数据
//程序结束
ch1:=make(chan string)
	ch2:=make(chan int)
	go func()
		for i:=97;i<=97+26;i++
			ch1<- fmt.Sprintf("%c",i)
		
		ch2<-1
	()
	go func()
		for n:=range ch1
			fmt.Println(n)
		
	()
	<-ch2
//输出 a b c d e f g h i j k l m n o p q r s t u v w x y z

c++复习笔记——继承(代码片段)

目录1.继承的概念和定义1.1继承的概念​ 1.2继承的定义1.3继承关系和访问限定符2.父类和子类的对象赋值转化3.继承中的作用域4.子类的默认成员函数4.1子类的构造函数4.2子类的拷贝构造函数4.3子类的赋值重载函数4.4子类的析构... 查看详情

go继承(代码片段)

文章目录1.前言2.嵌入式继承机制3.嵌入式继承机制的的局限4.使用接口封装方法5.小结参考文献1.前言面向对象编程的三大特性:封装、继承、多态。可见继承是面向对象程序设计中一个重要的概念。Go作为面向对象的编程语... 查看详情

go语言命令行复习笔记(代码片段)

Go语言自带有一套完整的命令操作工具。goclean这个命令是用来移除当前源码包里面编译生成的文件。我一般都是利用这个命令清除编译文件,然后github递交源码,在本机测试的时候这些编译文件都是和系统相关的,但... 查看详情

java复习类的重用(代码片段)

4.1类的继承Java只支持类的单继承,每一个子类只能有一个直接父类。#继承的语法classchildClassextendsparentClass//类体子类不能直接访问从父类中继承的私有属性及方法,但可以使用共有(及保护)方法进行访问。方法覆盖如果子类... 查看详情

第20课go如何实现继承的(代码片段)

golang语言中没有继承,但是可以依靠组合来模拟继承和多态。packagecontrollersimport("encoding/json"md"gowebProject/models"//给引用的模块起个别名"github.com/astaxie/beego")typeUserControllerstructbeego.Controller//通过这种组合来实现继承func(c*UserC 查看详情

java面向对象复习(代码片段)

...本使用构造方法的重载this关键字2.private3.封装的好处三、继承1.继承的概念2.extends3.super关键字4.Object5.更复杂的继承6.final关键字7.组和四、多态1.向向转型 查看详情

go继承(代码片段)

go中没有继承,只能通过组合来实现继承。继承和组合区别继承就是子类继承了父类的特征和行为,使得子类实例具有父类的行为和方法,属于is-a的范畴。组合就是通过对现有对象的拼装从而获得实现更为复杂的行为的方法。一... 查看详情

goalng:基础复习一遍过(代码片段)

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。  剖析Helloworld  新建文件main.go写入以下内容:packagemainimport"fmt"funcmain()fmt.Println("HelloWorld!")其中,packgemain 的作... 查看详情

两分钟让你明白go中如何继承(代码片段)

...,抽象了大量的接口。也使用这些抽象的接口做了很多伪继承的操作,极大的减少了代码冗余,同时也增加了代码的可读性。然后随便搜了一下关于Go继承的文章,发现有的文章的代码量过多,并且代码format极其粗糙,命名极其... 查看详情

#yyds干货盘点#愚公系列2022年08月go教学课程032-结构体方法继承(代码片段)

一、结构体方法继承1.继承的概念继承是指一个子类(或称为派生类)继承父类(或称为基类)的特征(属性和操作)。继承是面向对象程序设计时实现代码复用的重要手段,它允许在原有的类的基础上进行扩展,增加功能,这样新产生... 查看详情

go语言自学系列|golang继承(代码片段)

视频来源:B站《golang入门到项目实战[2021最新Go语言教程,没有废话,纯干货!持续更新中...]》一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!附上汇总贴ÿ... 查看详情

go中匿名字段的方法继承与方法重写(代码片段)

//code_019_struct_anonymous_field_methodprojectmain.gopackagemainimport("fmt")typePersonstructnamestringsexbyteageintfunc(p*Person)PrintInfo()fmt.Printf("Person:%s,%c,%d",p.name,p.sex,p.age)type 查看详情

cgbtn2111-day08总结复习(代码片段)

DAY08复习1.继承中变量的使用父类成员变量与子类成员变量同名时,使用super.变量名指定父类的成员变量2.继承中构造方法的使用创建子类对象时,会先调用父类的无参构造,因为子类的构造函数中默认存在一个super();... 查看详情

cgbtn2111-day08总结复习(代码片段)

DAY08复习1.继承中变量的使用父类成员变量与子类成员变量同名时,使用super.变量名指定父类的成员变量2.继承中构造方法的使用创建子类对象时,会先调用父类的无参构造,因为子类的构造函数中默认存在一个super();... 查看详情

go语音之进阶篇接口的继承(代码片段)

1、接口的继承示例:packagemainimport"fmt"typeHumanerinterface//子集 sayhi()typePersonerinterface//超集 Humaner//匿名字段,继承了sayhi() sing(lrcstring)typeStudentstruct namestring idint//Student实现了sayhi()func(tmp*Student)sayhi() fmt.Printf("Student[%s,%d]sayhi",tmp.name,tm... 查看详情

go中的"继承"之struct的匿名字段2(代码片段)

//code_016_struct_anonymous_field2projectmain.gopackagemainimport("fmt")typePersonstructnamestringsexbyteageinttypeStudentstructPersonidintaddrstringnamestring//同名字段typemystrstring//自定义类型typeStude 查看详情

面向对象编程-总复习(代码片段)

...独有属性对象的绑定方法类与数据类型面向对象进阶类的继承类的派生类的组合菱形继承问题多态与多态性类的封装类的property特性类与对象的绑定方法和非绑定方法面向对象高级isinstance,issubclass反射callnew元类单例模式利用类的... 查看详情

go结构体嵌套和用结构体实现模拟“继承”(代码片段)

什么是结构体嵌套一个结构体中可以嵌套包含另一个结构体或结构体指针结构体嵌套packagemainimport"fmt"//桌子结构体typetablestruct materialstring shapeint comcommon//嵌套结构体//被嵌套的结构体定义typecommonstruct yearintfuncmain() //嵌套结... 查看详情