1. 结构体

  • go中没有class这个概念,但有struct
  • 结构体的所有字段在内存中是连续
  • 结构体类型与结构体类型之间也可以相互转换,但是转换需要有完全相同的字段
    • 名字,个数,类型
type A struct{Num int
}
type B struct{Num int
}var a A
var b B
a=A(b)

1.1 结构体的声明

type 结构体名称 struct{field1 typefiled2 type
}

1.2 结构体的使用

  • 方式1
p1:=Person{"mary",20}
fmt.Println(p1)p2:=Person{name:"zhangsan",age:19,
}
  • 方式2
var p1 *Person=new(Person)
// go中指针可以用.
/**
对于指针p1,go的设计者,为了操作方便,当使用时p1.Name="李四",
底层自动会转换为(*p1).Name="李四"
*/
p1.Name="李四"
  • 方式3
var p1 *Person=&Person{}

1.3 声明时加上tag(用于序列化)

type Monster struct{Name string `json:"name"`Age int `json:"age"`Skill string `json:"skill"`
}monster :=Monster{"牛魔王",200,"芭蕉扇。。"}
jsonStr,err:=json.Marshal(monster)
if err!=nill{处理锁雾
}
fmt.Println("jsonStr",string(jsonStr))
  • 私有字段好像不能被序列化

1.4 给结构体添加方法

  • 在结构体外添加
func (receiver type) methodName(参数列表) (返回值列表){方法体return 返回值
}
type A struct{Num int
}
func (a A) test(){fmt.Println(a.Num)
}var a A
a.Num=10
a.test()
  • go中的方法作用在指定数据类型上的,因此自定义数据类型都可以有方法
  • 而且不仅仅是struct,比如int,float32等都可以有方法
  • 方法首字母小写,只能本包访问,方法首字母大写,其他包也可以访问
  • 如果一个类型实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出
  • 通过一个变量调用方法时,其调用机制和函数一样,不一样的是,变量调用方法时,该变量本身也会作为一个参数传递到方法
    • 如果是值类型则进行值拷贝
    • 如果是引用类型则进行引用拷贝

1.5 方法与函数的区别

调用方式不一样

  • 函数:函数名(实参列表)
  • 方法:变量.方法名(实参列表)

普通函数,接受者为值类型时,不能将指针类型的数据直接传递,反之亦然
但对于方法,它只看接受者的类型,你可以传值类型,也可以传引用类型,但在方法里都是按照接受者的类型来看待

1.6 工厂模式向其他包提供私有结构体

package model
type student struct{Name stringScore float64
}
func NewStudent(n string,s float64) *student{return &student{Name:n,Score:s,}
}//其他包中
var stu=model.NewStudent("tom~~",99.2)

2. 面向对象

2.1 封装

  • 对结构体中的属性进行封装
type person struct{Name stringage intsal float64
}
func NewPerson(name string) *person{return &person{Name:name,}
}
func (p *person) SetAge(age int){p.age=age
}
func (p *person) GetAge() int{return p.age
}
func (p *person) SetSal(sal float64){p.sal=sal
}
func (p *person) GetSal() float64{return p.sal
}// 其他包
p:=model.NewPerson("smith")
p.SetAge(18)
p.SetSal(500)
fmt.Println(p)

2.2 继承

type Goods struct{Name stringPrice int
}
type Book struct{Goods // 嵌套匿名结构体就是继承Writer string
}
  • 结构体可以使用嵌套匿名结构体所有的字段和方法(无论首字母是否大小写)
  • 结构体中的匿名字段还可以是基本数据类型,但不能有多个同一基本数据类型的匿名字段
type Monster struct{Name stringAge int
}
type E struct{Monsterintn int
}
var e E
e.Name="张三"
e.Age=11
e.int=20
e.n=40

2.2.1 创建结构体给继承字段也赋值

type Goods struct{Name stringPrice float64
}type Brand struct{Name stringAddress string
}
type TV struct{GoodsBrand
}
type Tv1 struct{*Goods*Brand
}tv:=TV{Goods{"电视机",500.9},Brand{"海尔","山东"},}
tv1:=TV1{&Goods{Name:"电视机",Price:100.2,},&Brand{Name:"长虹",Address:"四川"},}

2.3 接口

2.3.1 声明接口

type 接口名 interface{method1(参数列表) 返回值列表...
}
  • go语言中一个结构体(变量)不需要显示地实现接口
  • 只要一个变量,含有该接口类型中的所有方法,那么这个变量就实现了这个接口
type Usb interface{Start()
}
type Phone struct{}
func (p Phone) Start(){fmt.Println("手机start")
}
func Working(usb Usb){usb.Start()
}
func main(){phone :=Phone{}Working(phone)
}

2.3.2 接口可以继承其他接口

type BInterface interface{test1()
}
type CInterface interface{test2()
}
type AInterface interface{BInterfaceCInterfacetest3()
}
  • 所有类型都实现了空接口

2.4 多态

2.4.1 多态参数

  • 函数的形参是接口,调用时传入的实参是接口的实现

2.4.1 多态数组

  • 数组是接口数组,存入的时候存入接口的实现
type Usb interface{}
var arr [3]Usb
arr[0]=1
arr[1]=99.1
arr[2]="string"

2.4.2 类型断言

接口变量.(类型)

type Usb interface{}
var a Usb
a="hello world"
str,ok :=a.(string)

go语言之面向对象编程相关推荐

  1. C++学习笔记:(七)C语言实现面向对象编程

    面试官:C和C++有什么不同? 应聘者:一个是面向过程,一个是面向对象. 这样的答案在我看是不完全正确,因为面向过程编程和面向对象编程是编程思想,C++可以用面向过程的思想编程,同样,C语言也可以用面 ...

  2. C 语言实现面向对象编程

    C 语言实现面向对象编程 1.引言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种设计方法.设计思想.它表现出来的三个最基本的特性就是封装.继承与多态.很多面向对象的编程语言已经包含这 ...

  3. 一步步分析-C语言如何面向对象编程

    这是道哥的第009篇原创 一.前言 在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式. 虽然C++语言是从C语言发展而来 ...

  4. ctor c语言,一步步分析-C语言如何面向对象编程

    这是道哥的第009篇原创 一.前言 在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式. 虽然C++语言是从C语言发展而来 ...

  5. c语言实现面向对象编程

    文章目录 概述 框架介绍 基类 c++基类 c 实现基类 派生类 c++派生类 C实现派生类 基于模型的多重继承 C++的多重继承 c的多重继承 对象创建和使用 C++ 应用 C应用 概述   有一种 ...

  6. 老汤回味——C语言与面向对象编程

    今天的文章我们来看看如何结合面向对象的思想使用C语言写出结构良好的代码.直接看代码,然后我们来分析一下代码中的含义.首先是头文件user.h: #ifndef USER_H #define USER_ ...

  7. Java语言基础-面向对象编程三步走之打开冰箱门

    开头: 何谓"面向对象" 面向对象是一种编程思想. 思想是一个很虚无缥缈的东西,但是它可以从一个人的具体行动中体现出来,如果说你坚持每天跑步,每天读书,做一些有益于身心健康的事情, ...

  8. PHP语言之面向对象编程

    第3关:面向对象编程与数据库综合运用 <?php class model {protected $db; //数据库操作类实例protected $tableName; //待操作的表名prot ...

  9. java语言基础-面向对象编程-方法(廖雪峰老师官网学习记录)

    Java是一种面向对象的编程语言. 面向对象编程,英文是Object-Oriented Programming,简称OOP. 面向对象编程,是一种通过对象的方式,把现实世界映射到计算机模型的一种编程方 ...

  10. C语言中面向对象编程

    C语言中面相对象的编程 面向对象的重要思想就是数据隐藏,在面向对象语言中,对象可以包含私有变量.这样我们可以说他们具有内部状态,这些内部状态对其他对象是透明的.全局变量可以通过设置变量作用域来模拟私有 ...

最新文章

  1. IDEA控制台输出乱码解决方案
  2. 中国最新奥数竞赛成绩出炉:南师大附中女生严彬玮满分夺冠!60人国家集训队名单公布...
  3. CTFshow php特性 web96
  4. angular4 表单
  5. 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----UDP篇
  6. 少年,看你异于常人,有空花2小时来参加有3000人的源码共读嘛~
  7. 盘点大厂的那些开源项目 - 小米科技
  8. 被该死的Openssl编译嘲讽了一个下午
  9. Java 联系Oracle 数据库
  10. 微软为“离线”做好准备:推出同步框架
  11. 跳槽的5个误区,冷静一下
  12. 如何把多个pdf文件合并成一个?
  13. 使用vue-cropper
  14. 什么是饱和失真?什么是截止失真?
  15. 程序员通病:小厂薪资低,想跳槽,又担心面试过不了!
  16. 微信定位当前城市 php,html5,javascript_微信内置浏览器如何定位用户所在城市,html5,javascript - phpStudy...
  17. linux下关于笔记本的显卡驱动安装archlinux
  18. C#原子操作(Interlocked.Decrement和Interlocked.Increment)
  19. 【南梦宫】预设性背景跟随对象算法
  20. 小白大学生学习MyBatis(二)

热门文章

  1. 台式计算机如何连接无线wifi,最新版:台式计算机如何连接到wifi?如何将台式计算机连接到无线网络...
  2. 【无标题】Python __all__=[]作用
  3. SEO优化标题长度对优化的作用
  4. Haar特征描述算子-人脸检测
  5. 简述php无限极分类,PHP 无限极分类
  6. Java实现简易斗地主
  7. imu 里程计融合_轮式里程计(Wheel Odometry)以及惯性导航(IMU)数据
  8. pandas学习笔记:某一列字符类型转换为离散的数值标签;将某一列数值类型转换成独热码
  9. 基础备忘:拷贝构造函数和赋值函数
  10. python for循环求和_pythonfor循环语句求和