结构体
将一个或多个变量组合到一起,形成新的类型,这个类型就是结构体。Go语言中的结构体和C++结构体有点类型,而Java和C#中类本质就是结构体。结构体是值类型。
结构体可以定义在函数内部或函数外部,影响的是访问范围, 结构体定义在函数外部,名称首字母是否大写影响到结构体是否能挎包访问,结构体能挎包访问,属于首字母是否大写影响到属性是否挎包访问。
由于结构体是值类型,声明后就会开辟内存空间,所有成员都有对应的初始值,可以直接给结构体多个属性赋值。
结构体指针
结构体是值类型,在方法传递时希望传递结构体地址,可以使用结构体指针完成。
结构体方法
方法和函数语法比较相像,区别是函数属于包,通过包调用函数,而方法属于结构体,通过结构体变量调用。
案例
package mainimport "fmt"type User struct { Name string Age int}func (p User) run() { fmt.Println("run() ", p)}func (p *User) run2() { fmt.Println("run2() ", p)}func main() { // 声明 var u1 User fmt.Println(u1) fmt.Printf("%p\n", &u1) u1.Name = "宋公明" u1.Age = 78 fmt.Println(u1) // 给结构体多个属性赋值 var u2 User = User{"宋公明", 78} fmt.Println(u2) var u3 User = User{Name: "宋公明", Age: 78} fmt.Println(u3) // 判断,值相同就是相等 fmt.Printf("%p-----%p-----%p\n", &u1, &u2, &u3) fmt.Println(u1 == u2) // true fmt.Println(u1 == u3) // true fmt.Println(u2 == u3) // true // 结构体指针 u4 := new(User) fmt.Println(u4) // &{ 0} fmt.Println(u4 == nil) //false fmt.Println(*u4) // { 0} u4.Name = "宋公明" u4.Age = 78 fmt.Println(u4) // &{宋公明 78} fmt.Println(u1 == *u4) // true // 结构体指针 // 结构体指针比较的是地址 var u5 *User u5 = &User{"宋公明", 78} fmt.Println(u5) // &{宋公明 78} fmt.Println(u4 == u5) // false fmt.Println(*u4 == *u5) // true // 方法 u6 := User{"宋公明", 78} u6.run() // run() {宋公明 78} u6.run2() // run2() &{宋公明 78}}
面向对象
面向对象和面向过程==>面向对象是一种思想,到目前为止还没有一个非常明确的定义,重点是:重用。
封装
封装主要体现在两个方面,封装数据、封装业务。Go中通过首字母大小写控制访问权限,属性首字母小写提供方法是封装数据最常见的实现方式。封装业务就是根据自己的需求提取代码,使用Go语言标准库中的函数过程就属于封装业务。
案例
package mainimport "fmt"func main() { // 面向对象,封装 p := People66{} p.SetName("宋公明") p.SetAge(78) fmt.Println(p.GetName()) fmt.Println(p.GetAget())}func (p *People66) GetName() string { return p.name}func (p *People66) GetAget() int { return p.age}func (p *People66) SetName(name string) { p.name = name}func (p *People66) SetAge(age int) { p.age = age}type People66 struct { name string age int}
继承
继承的实现方式:通过关键字实现。继承的实现方式有,强耦合实现,组合式继承和松耦合方式。
传统面向对象中类与类之间的关系,组合 > 聚合 > 关联 > 依赖
继承:is-a,强耦合性,一般认为类与类之间具有强关系;
实现:like-a,接口和实现类之间的关系;
依赖:use-a,具有偶然性的、临时性的、非常弱的;
关联:has-a,一种依赖关系;
聚合:has-a,整体与部分,拥有的关系;
组合:contains-a,比聚合更强,也称为强聚合。
案例
package mainimport "fmt"type Person struct { Name string Age int}type User struct { Person Username string}func main() { var user User = User{Person{"宋公明", 78}, "song"} fmt.Println(user)}