这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
额,其实今天没咋学习Go,自己Java学的半截,又来假期开Go的新坑,其实自己有点后悔的……
Go语言面向对象的特殊之处
一花一世界,一个程序就是一个世界,有很多对象(变量)。
Go语言所谓的面向对象编程,与Java所谓的面向对象编程有很大区别,或者说我可以称其为“伪”面向对象?他给我的感觉maybe像一种,给C这种面向过程的语言中的结构体添加了方法。所以说它的结构体struct就等同于Java中的类class。
Golang面向对象编程非常简洁,去掉了传统OOP语言的继承(方式不同)、方法重载、构造函数和析构函数、隐藏的this指针等等……Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:Golang没有extends关键字,继承是通过匿名字段来实现。同时要格外注意Go语言中的接口作用。
结构体
结构体便是相当于Go语言面向对象的一个前导知识。
结构体的构建
C里面已经交过了……
type 标识符 struct {
//结构体成员变量 变量类型
}
结构体变量在内存中的布局
假设我们设置下面这样一个结构体:
type Cat struct {
Name string
Age int
Color string
Hobby string
}
定义一个该结构体对象
var cat1 Cat
cat1.Name = "doom"
cat1.Age = 3
cat1.Color = "yellow"
cat1.Hobby = "eat fish"
下面我们来分析一下内存的响应……其实也不用分析,就如同Java的引用类型变量内存方式cat1变量地址指向内存中的一块空间——该空间中存在四个内存地址,分别储存cat1的Name、Age、Color、Hobby数据……
结构体的初始化
命名一个结构体变量后,如果没有给其中某个变量赋值,则会赋给它一个默认初始值,布尔是false, 整型是0,这两个大家都一样;与Java不同的是,string默认初始值是"",数组的初始化与它的成员类型有关,其他的则跟Java中的引用类型一样,不过从null变成了nil。
结构体方法
额,怎么说呢,就是比普通方法,在方法名前面加一个结构体参数,如下:
type user struct {
name string
password string
}
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
这里面的checkPassword和resetPassword便是结构体user的两个方法,跟Java里的类方法差不多~ 测试一下:
package main
import "fmt"
type user struct {
name string
password string
}
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
func main() {
a := user{name: "wang", password: "1024"}
a.resetPassword("2048")
fmt.Println(a.checkPassword("2048")) // true
}
运行结果:true
今天收个尾
额,就如同我标题说的那样,今天没咋学Go其实,面向对象其实就看了这一点点,但是笔记这个东西本来也就是给自己看的,结构学的东西还有很多,但是自己觉得放在这个笔记里即重复了自己学Java是面向对象时的步骤,也浪费时间,对自己Go语法上的实质性帮助也没有,索性就这样了,明天自己会去开始面向对象三大思想——封装,继承,多态(maybey