go 语言中的类的实现,类的属性和方法
文章目录
go语言中的类是如何实现的?
go语言中严格意义来说是没有类的概念,当然也不存在面向对象的封装和继承,
但是go语言可以通过struct 结构体来模拟类的概念,试的我们用起来像是一种类.
struct 如何来实现面向对象的类?
struct 首先是一种类型,值类型.它是由一系列具有相同类型或不同类型的数据构成的数据集合.
和c语言的struct很像,用起来就相当于java / c# 中的的class .
struct 的定义
下面的内容中我们直接把struct 称呼为 "类"
type student struct {
name string
age int
}
上面的 student 类,有2个字段(name 和 age )
struct 的使用
第一种:0值初始化
package main
import (
"fmt"
)
type student struct {
name string
age int
}
func main() {
s := student{}
s.name = "zhangzhi"
s.age = 35
fmt.Printf("student name is %s ,age is %d", s.name, s.age)
}
s:=student{} 此方法初始化student类,并用对应类型的0值在内存中初始化对应字段.
第二种:字面量初始化类的方法:
package main
import (
"fmt"
)
type student struct {
name string
age int
}
func main() {
s := student{
name: "zhangzhi",
age: 35,
}
fmt.Printf("student name is %s ,age is %d", s.name, s.age)
}
上面直接采用字面量初始化:
s := student{
name: "zhangzhi",
age: 35,
}
第三种:new 来0值初始化
package main
import (
"fmt"
)
type student struct {
name string
age int
}
func main() {
s := new(student)
s.name = "zhangzhi"
s.age = 35
fmt.Printf("student name is %s ,age is %d", s.name, s.age)
}
第四种:使用 var 初始化各字段零值
package main
import (
"fmt"
)
type student struct {
name string
age int
}
func main() {
var s = new(student)
s.name = "zhangzhi"
s.age = 35
fmt.Printf("student name is %s ,age is %d", s.name, s.age)
}
使用 var s=new(student) 来初始化student类,各字段均为0值
go语言中如何实现类的可访问性
刚才我们在结构体中定义了一些字段,而这些结构体在功能上等同于其他面向对象语言中的类,
既然是类,那就可以暴露一些属性,go中如何暴露类和属性的可访问性呢?
go语言中的命名规范和大小写访问权限:
1.go的命名推荐使用驼峰命名法,
必须以一个字母(Unicode字母)或下划线开头,
后面可以跟任意数量的字母、数字或下划线.
2.go中根据首字母的大小写来确定可以访问的权限.
无论是方法名、常量、变量名还是结构体的名称,如果首字母大写,则可以被其他的包访问;
如果首字母小写,则只能在本包中使用.
go语言中类的方法如何实现
package main
import (
"fmt"
)
type student struct {
name string
age int
}
func (s student) GetName() string {
return s.name
}
func main() {
var s = new(student)
s.name = "zhangzhi"
s.age = 35
fmt.Printf("student name is %s ,age is %d", s.GetName(), s.age)
}
从上面代码对比,我们发现多了一个方法定义
func (s student) GetName() string {
return s.name
}
但是此方法和 go语言其他方法有区别, func 关键词 和方法名中间多了一个指向类型的实例 (s students)
类似这种指向定义类型实例或者指针的方法,就称作是类的方法.
我们可以通过类的实例来直接调用
mt.Printf("student name is %s ,age is %d", s.GetName(), s.age)
s.GetName() 返回了 students 实例的 name 值.
类的方法命名格式
func (接收者变量名 接收者) 方法名() 返回值类型 {
}