golang是面向过程的语言,go中没有类,单go支持面向对象的编程,go中的struct就像其他语言中的类;go里没有继承,但可以通过组合来实现。
struct结构体是一种自定义类型,是不同数据的几何体,struct是值类型,通常用来定义一个抽象的数据对象,比如学生,可以有姓名,年龄,班级的数据构成。
定义
type Student struct{
Name string
Age int
Class string
}
实例化
- 通过New创建实例
stu := new(Student)
stu.Name = "Chain"
stu.Age = 23
stu.Class = "3-2"
- 按照顺序提供初始化值
stu := Student{"Chian", 23, "3-2"}
- 按照field:value的方式初始化
stu := Student{Name:"Chain", Age:23, Class:"3-2"}
成员方法
定义成员方法的格式如下:
func (变量名 结构体类型) 函数名(参数列表) (返回类型列表)
例如:
func (s Student) Display() {
fmt.Printf("Name=%s, Age=%d, Class=%s\n", s.Name, s.Age, s.Class)
}
调用的时候直接用实例名点函数名即可例如:
stu := Student{"Chian", 23, "3-2"}
stu.Display()
注意
interfacegolang中没有显式的定义字段或函数的访问权限,那么,访问权限是怎么定义的呢?
字段或函数的首字母大写的话,则为public权限
字段或函数的首字母小写的话,则为private权限
接口是一系列操作的集合,是一种约束。我们可以把它看作与其他对象通讯的协议。任何非接口类型只要拥有某接口的全部方法,就表示它实现了该接口,go中无需显式的在该类上添加接口声明。
例如:
package main
import (
"fmt"
)
func main(){
var stu IStudent
stu = &Student{"chain", 23}
stu.Display()
fmt.Println(stu.GetName())
fmt.Println(stu.GetAge())
}
type Student struct{
Name string
Age int
}
func (stu *Student) Display(){
fmt.Println("i am student")
}
func (stu *Student) GetName() string{
return stu.Name
}
func (stu *Student) GetAge() int{
return stu.Age
}
type IStudent interface{
Display()
GetName() string
GetAge() int
}
[图片上传失败...(image-f37b74-1514188348248)]
面向对象的三大特性学过面向对象的同学应该都知道面向对象的三大特性:封装,继承,多态。
这三大特性在golang中如何实现呢?
请看以下3个例子
封装
package main
import (
"fmt"
)
func main(){
stu := new(Student)
stu.SetName("chain")
fmt.Println(stu.GetName())
}
type Student struct{
name string
}
func (stu *Student) SetName(name string){
stu.name = name
}
func (stu *Student) GetName() string{
return stu.name
}
[图片上传失败...(image-e4668b-1514188348248)]
继承
package main
import (
"fmt"
)
func main(){
stu := Student{"chain"}
fmt.Println(stu)
aStu := AStudent{Student{"chain"}, 23}
fmt.Println(aStu)
}
type Student struct{
name string
}
type AStudent struct{
Student
Age int
}
[图片上传失败...(image-6a9fd1-1514188348248)]
多态
package main
import (
"fmt"
)
func main(){
var stu IStudent
stu = &AStudent{}
stu.Display()
stu = &BStudent{}
stu.Display()
}
type AStudent struct{
}
func (stu *AStudent) Display(){
fmt.Println("i am a student")
}
type BStudent struct{
}
func (stu *BStudent) Display(){
fmt.Println("i am b student")
}
type IStudent interface{
Display()
}
[图片上传失败...(image-79e86e-1514188348248)]
完目录
上一节:Golang 学习笔记(04)—— array, slice, map
下一节:Golang 学习笔记(06)—— 多线程