go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别
入门示例
package main import "fmt" //定义老师结构体,将老师中的各个属性 统一放入结构体中管理: type Teacher struct{//变量名字大写外界可以访问这个属性Name stringAge intSchool string } func main(){//创建老师结构体的实例、对象、变量:var t1 Teacher // var a intfmt.Println(t1) //在未赋值时默认值:{ 0 }t1.Name = "xxx"t1.Age = 45t1.School = "清华大学"fmt.Println(t1)fmt.Println(t1.Age + 10) }struct内存分析
结构体实例的创建方式
【1】方式1:直接创建:
【2】方式2:创建并赋值
【3】方式3:返回的是结构体指针:
【4】方式4:返回的是结构体指针:
结构体之间的转换
【1】结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)
package main import "fmt" type Student struct {Age int } type Person struct {Age int } func main(){var s Student = Student{10}var p Person = Person{10}s = Student(p)fmt.Println(s)fmt.Println(p) }【2】结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转
package main import "fmt" type Student struct {Age int } type Stu Student func main(){var s1 Student = Student{19}var s2 Stu = Stu{19}s1 = Student(s2)fmt.Println(s1)fmt.Println(s2) }方法的引入
【1】方法是作用在指定的数据类型上、和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct
【2】方法的声明和调用格式:
(1)func (a A) test()相当于A结构体有一个方法叫test
(2)(a A)体现方法test和结构体A绑定关系
【3】代码层面:
方法的注意事项
(1)结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式
(2)如程序员希望在方法中,改变结构体变量的值,可以通过结构体指针的方式来处理
我们写程序的时候,可以直接简化:
底层编译器做了优化,底层会自动帮我们加上 & *
(3)Golang中的方法作用在指定的数据类型上的,和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct,比如int , float32等都可以有方法
package main import "fmt" type integer int func (i integer) print(){i = 30fmt.Println("i = ",i) } func (i *integer) change(){*i = 30fmt.Println("i = ",*i) } func main(){var i integer = 20i.print()i.change()fmt.Println(i) }(4)方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。
(5)如果一个类型实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出
以后定义结构体的话,常定义String()作为输出结构体信息的方法,在fmt.Println会自动调用
package main import "fmt" type Student struct{Name stringAge int } func (s *Student) String() string{str := fmt.Sprintf("Name = %v , Age = %v",s.Name,s.Age)return str } func main(){stu := Student{Name : "丽丽",Age : 20,}//传入地址,如果绑定了String方法就会自动调用fmt.Println(&stu) }方法与函数的区别
【1】绑定指定类型:
方法:需要绑定指定数据类型
函数:不需要绑定数据类型
【2】调用方式不一样:
函数的调用方式:
函数名(实参列表)
方法的调用方式:变量.方法名(实参列表)
【3】对于函数来说,参数类型对应是什么就要传入什么。
package main import "fmt" type Student struct{Name string } //定义函数: func method01(s Student){fmt.Println(s.Name) } func method02(s *Student){fmt.Println((*s).Name) } func main(){var s Student = Student{"丽丽"}method01(s)//method01(&s)错误method02(&s)//method02(s)错误 }【4】对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型。
package main import "fmt" type Student struct{Name string } //定义方法: func (s Student) test01(){fmt.Println(s.Name) } func (s *Student) test02(){fmt.Println((*s).Name) } func main(){var s Student = Student{"丽丽"}s.test01()(&s).test01()//虽然用指针类型调用,但是传递还是按照值传递的形式(&s).test02()s.test02()//等价 }总结
以上是生活随笔为你收集整理的go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: go map(映射)的概念、3种创建方式
- 下一篇: go slice切片详解:定义、遍历、追