• 首页
  • go
  • go 语言中的类的实现,类的属性和方法

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 (接收者变量名  接收者) 方法名() 返回值类型 {

} 

出自:go 语言中的类的实现,类的属性和方法

回到顶部