一.前言
1.golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但是他有一个类似功能的结构嵌入
2.Go 语言中结构体的内嵌配合接口比面向对象具有更高的扩展性和灵活性。
3.Go 语言不仅认为结构体能拥有方法,且每种自定义类型也可以拥有自己的方法。
二.实例化
package main
import "fmt"
type Student struct {
name string
age int
}
func main() {
//1. 顺序初始化: 依次将结构体内部所欲成员初始化。
var stu1 Student = Student{"小明",10}
fmt.Println(stu1)
//2. 指定成员初始化:
stu2 := Student{name:"小红"}
fmt.Println(stu2)
//3. 使用“.”索引成员变量
var stu3 Student;
stu3.name = "小白"
stu3.age = 15
fmt.Println(stu3)
}
三.结构体变量比较
结构体==操作符会比较struct每一个子项的值是否相同
var stu3 Student;
stu3.name = "小白"
stu3.age = 15
fmt.Println(stu3)
stu4 := Student{name: "小白", age: 15}
fmt.Println(stu3 == stu4)
返回值为true
四.结构体地址
结构体变量的地址 == 结构体首个元素的地址。
var stu1 Student = Student{"小明", 10}
fmt.Printf("&tmp = %p\n", &stu1)
fmt.Printf("&temp.name = %p\n", &(stu1.name))
返回结果
&tmp = 0xc04204e3e0
&temp.name = 0xc04204e3e0
五.结构体传参
普通值传递将结构体变量的值拷贝一份,传递。 —— 几乎不用。 内存消耗大,效率低。
六.结构体指针
func structPoint() {
//1. 顺序初始化: 依次将结构体内部所欲成员初始化。
var stu1 *Student = &Student{"小明",10}
fmt.Println(stu1)
//2. 自动推导类型
stu2 := &Student{"小绿",10}
fmt.Println(stu2)
//3.使用new
stu3 := new(Student)
stu3.name = "小红"
fmt.Println(stu3)
}
返回结果
&{小明 10}
&{小绿 10}
&{小红 0}
七.方法引用传递
func main() {
stu3 := new(Student)
stu3.name = "xxx"
stu3.age = 99
fmt.Println(stu3)
changeStruct(stu3)
fmt.Println(stu3)
}
func changeStruct(stu *Student){
stu.name = "已改变"
}
结果
&{xxx 99}
&{已改变 99}