- 结构体的定义
go语言没有面向对象的概念,结构体的定义与类型定义类似,只不过多了一个struct
关键字。
1. 结构体的定义 type 结构体类型名称 struct{ 成员定义; 成员定义; 成员定义; } -----------------测试 package main import "fmt" type Student struct { name string age int sex int teacher string } func main() { var s1 Student s1.name = "李明" s1.age = 20 s1.sex = 0 s1.teacher = "王先生" fmt.Printf("%T\n", s1) fmt.Printf("%v\n", s1) } -----------------测试 2.匿名结构体定义: var 结构体名字 struct{ xxxx xxxx } -----------------测试 package main import "fmt" func main() { var Student struct { name string age int sex int teacher string } Student.age = 20 Student.name = "jsxs" Student.sex = 1 Student.teacher = "丽丽" fmt.Printf("%v\n", Student) } -----------------测试
- 结构体的初始化
1.第一种: 以键值对的方式进行初始化 type Person struct { id int name string age int email string } var jsxs Person //类型定义 // 1.第一种定义方式 -> 使用键值对 jsxs = Person{ //进行初始化 id: 1, name: "heh", age: 0, email: "22123121", //最后一个也要添加逗号 } 2.第二种:按照顺序的方式进行初始化。顺序一定要保持一致 type Person struct { id int name string age int email string } var jsxs Person jsxs = Person{1, "dsds", 0, "dssdsd"} 3.第三种:利用语法糖方式 jsxs:=Person{ xx:xx }
- 结构体指针
结构体指针和普通的变量指针相同.
1.普通方法创建结构体指针 type Person struct { id int name string age int email string } jsxs := Person{1, "dsds", 0, "dssdsd"} var p1 *Person // 定义一个结构体指针 p1 = &jsxs //指针指向地址 fmt.Printf("%v\n", jsxs) fmt.Printf("%v\n", *p1) 2. new创建结构体指针 new(结构体名字) type Person struct { id int name string age int email string } jsxs := Person{1, "dsds", 0, "dssdsd"} var p1 = new(Person) ///---》利用new //var p1 *Person // 定义一个结构体指针 p1 = &jsxs //指针指向地址 fmt.Printf("%v\n", jsxs) fmt.Printf("%v\n", *p1) 3.结构体指针的访问-》 指针变量名.属性/ (*指针变量名).属性 type Person struct { id int name string age int email string } jsxs := Person{1, "dsds", 0, "dssdsd"} var p1 = new(Person) //var p1 *Person // 定义一个结构体指针 p1 = &jsxs //指针指向地址 fmt.Printf("%v\n", jsxs) fmt.Printf("%v\n", *p1) fmt.Printf("%v", p1.id) //与下面的结果一致 fmt.Printf("%v", (*p1).id) //与上面的结果一致 (*)可以省略
4.结构体作为函数参数
go结构体可以像普通变量一样,作为函数的参数,这里分为两种情况
- 直接传递结构体,这是一个副本(拷贝),在函数内部不会改变外面结构体内容
- 传递结构体指针,这时在函数内部,能够改变外部结构体内容
1. 值传递: 形参改变实参不变 package main import "fmt" type Person struct { id int name string age int email string } func test(p1 Person) { p1.id = 1 p1.name = "sdsds" p1.age = 20 p1.email = "sdsd" fmt.Printf("%v\t", p1) } func main() { person := Person{2, "SDDF", 0, "GFDG"} test(person) //值传递 fmt.Printf("%v\t", person) } -------------- 2.指针传递: 形参改变实参也改变 package main import "fmt" type Person struct { id int name string age int email string } func test(p1 *Person) { //指针接受 p1.id = 1 p1.name = "sdsds" p1.age = 20 p1.email = "sdsd" fmt.Printf("%v\t", p1) } func main() { person := Person{2, "SDDF", 0, "GFDG"} p1 := new(Person) // 创建一个指针 p1 = &person test(p1) //传递一个地址 fmt.Printf("%v\t", *p1) }
- 结构体的嵌套
package main import "fmt" type Person struct { name string age int pie Pie //人类拥有宠物 } type Pie struct { name string //姓名 sort string //种类 } func main() { p := Person{ name: "jsxs", age: 20, pie: Pie{ //初始化结构体 name: "小黄", sort: "金毛", }, } fmt.Printf("%v", p) }
(10).方法 ✔™✅
Go语言没有面向对象的特性,也没有类对象的概念。但是,可以使用结构体来模拟这些特性,我们都知道面向对象里面有类方法概念
。我们也可以声明一些方法,属于某一个结构体。
Go语言方法的语法
Go中的方法是一种特殊的函数,定义struct之上(与struct关联,绑定),被称为struct的接收者(receive)。通俗的讲: "方法就是有接收者的函数"
- 方法的定义
1.方法的定义 -> 一个方法和一个函数非常相似,多了一个接受类型 type 结构体名 struct{} func (接受该方法的结构体 结构体名) 方法名称(参数列表) 返回值类型 {} func (接受该方法的结构体 *结构体名) 方法名称(参数列表) 返回值类型 {} *********************************************************** 值传递 package main import "fmt" type Person struct { // 1.定义一个结构体 name string } func (per Person) eat() { //2. 给结构体Person添加一个eat()的方法 fmt.Printf("%v,eat....", per.name) } func (per Person) sleep() { //3. 给结构体Person添加一个sleep()的方法 fmt.Printf("%v,sleep....", per.name) } func (per Person) sum(a, b int) int { return a + b } func main() { person := Person{ // 4.初始化结构体 name: "李明", } person.eat() // 5.结构体本身调用自己的属性 person.sleep() println(person.sum(1, 2)) } ***********************************************************
- 方法接收者类型
结构体实列,有值类型和指针类型,那么方法的接受者是结构体,那么有值类型和指针类型。区别就是接收者是否赋值结构体副本。值类型拷贝,指针类型不拷贝。
指针传递 package main import "fmt" type Person struct { // 1.定义一个结构体 name string } func (per *Person) test() { //2.添加一个指针 per.name = "sssss" fmt.Printf("%v", per.name) } func main() { person := Person{ // 4.初始化结构体 name: "李明", } p := new(Person) p = &person fmt.Printf("%v", person) p.test() // 通过指针进行调用 fmt.Printf("%v", person) //println(person) }
(11).接口类型
接口像是一个公司里面的领导,他会定义一些通用规范,只设计规范,而不实现规范。Go语言的接口是一种新的类型定义,他把所有的具有共性的方法定义在一起,任何具有其他类型只要实现了这些方法就是实现了这个接口
。
1.接口的初始化
1.定义接口 type interface_name interface{ 方法名 [返回值] } 2. 定义结构体 type struct_name struct{ 成员变量 } 3.实现接口的方法 func(结构体变量 结构体变量名) 方法名() [返回值类型]{ 方法实现 } 4.声明接口有哪个结构体来实现
在接口中定义,若干个空方法。这些方法都具有通用性。
假如说一个结构体要实现一个接口,那么他要实现结构体的所有方法;否则会报错
package main import "fmt" // 定义一个接口存在两个方法 type USB interface { read() //定义一个读的方法 write() //定义一个写的方法 } // 定义一个结构体 type Computer struct { name string } // 给结构体添加一个方法-》实现接口的方法 func (c Computer) read() { fmt.Printf("%v\n,read......", c.name) } // 给结构体添加一个方法-》实现接口的方法 func (c Computer) write() { fmt.Printf("%v\n,write......", c.name) } func main() { var usb USB // 定义一个接口变量 computer := Computer{ name: "HP", } usb = computer //声明这个接口将有computer这个结构体来实现 usb.read() //接口调用 usb.write() }
- 接口值类型接收者和指针类型接收者
值接受就是一个拷贝,指针接受就是非拷贝
1.值传递 ****************************************************** package main import "fmt" // 定义一个接口存在两个方法 type USB interface { read() //定义一个读的方法 write() //定义一个写的方法 } // 定义一个结构体 type Computer struct { name string } // 给结构体添加一个方法 func (c Computer) read() { c.name = "sds" // 在里面惊进行修改 ------- 值操作 fmt.Printf("%v,reading......\n", c.name) } // 给结构体添加一个方法 func (c Computer) write() { c.name = "sds" // 在里面惊进行修改 ------- 值操作 fmt.Printf("%v,write......\n", c.name) } func main() { var usb USB // 定义一个接口变量 computer := Computer{ name: "HP", } usb = computer //声明这个接口将有computer这个结构体来实现 usb.read() //接口调用 usb.write() fmt.Printf("%v", computer.name) } ****************************************************** 2.指针传递 ****************************************************** package main import "fmt" // 定义一个接口存在两个方法 type USB interface { read() //定义一个读的方法 write() //定义一个写的方法 } // 定义一个结构体 type Computer struct { name string } // 给结构体添加一个方法 func (c *Computer) read() { // 指针传递 ----- c.name = "sds" // 在里面惊进行修改 ------- 值操作 fmt.Printf("%v,reading......\n", c.name) } // 给结构体添加一个方法 func (c *Computer) write() { // 指针传递 ----- c.name = "sds" // 在里面惊进行修改 ------- 值操作 fmt.Printf("%v,write......\n", c.name) } func main() { var usb USB // 定义一个接口变量 computer := Computer{ name: "HP", } usb = &computer //声明这个接口将有computer这个结构体来实现 ---指针传递 usb.read() //接口调用 usb.write() fmt.Printf("%v", computer.name) }