go语言--面向对象
创始人
2025-05-28 05:08:22
0

面向对象的引入

Golang没有类(class),Go语言的结构体(struct)和其他语言的类(class)有同等地位,你可以理解Golang是基于struct来实现面向对象(OOP)

具体对象

用户: 用户id(int|long),姓名(string),年龄(int),性别(bool|string)

结构体定义

方式一

package main
import "fmt"type User struct{//变量名大写可以让其他方法可以访问到这个属性Id intName stringAge intSex string}func main(){//创建结构体实例、对象、变量var chen Userfmt.Println(chen)
}

在这里插入图片描述
如图说明Id:0,Name:null,Age:0,Sex:null

方式二

var 实例名 对象类型 = 对象类型{}
package main
import "fmt"type User struct{//变量名大写可以让其他方法可以访问到这个属性Id intName stringAge intSex string}func main(){//创建结构体实例、对象、变量var chen User = User{0,"admin",10,"保密"}fmt.Println(chen)
}

在这里插入图片描述

方式三

返回结构体指针

var 实例名 *对象类型 = new(对象类型)
//赋值
(*实例名).属性 = value
//实例名.属性=value  //go底层还是做了处理:  实例名.属性  转化   (*实例名).属性
package main
import "fmt"type User struct{//变量名大写可以让其他方法可以访问到这个属性Id intName stringAge intSex string}func main(){//创建结构体实例、对象、变量var chen *User = new(User)(*chen).Id = 0(*chen).Name = "admin"(*chen).Age = 10(*chen).Sex = "保密"fmt.Println(chen)
}

方法四

返回结构体指针

var 实例名 *对象类型 = &对象类型{}

结构体之间的转化

方法一

type 对象名1 struct{Name string //同一属性
}
type 对象名2 struct{Name string //同一属性
}
func main(){var 实例名1 对象名1var 实例名2 对象名2实例名1 = 对象名1(实例名2)
}
package main
import "fmt"type User struct{//变量名大写可以让其他方法可以访问到这个属性Name string
}
type Person struct{Name string
}func main(){//创建结构体实例、对象、变量var u Uservar p Personu = User(p)fmt.Println(u)
}

方法二

结构体type重新定义(相当于取别名); Golang认为是新数据类型,但相互间可以强转

type 对象名1 struct{
}
type 对象名2 对象名1 //重定义对象1为对象2
func main(){var 实例名1 对象名1var 实例名2 对象名2实例名1 = 对象名1(实例名2) //重定义还是得强转
}
package main
import "fmt"type User struct{//变量名大写可以让其他方法可以访问到这个属性Name string
}
type U Userfunc main(){//创建结构体实例、对象、变量var u Uservar u1 Uu = User(u1)fmt.Println(u)
}

方法的引入

方法是作用在指定的数据类型上,和指定的数据类型绑定;因此自定义类型都可以有方法,不仅仅是struct

声明

type 对象名 struct{...
}
//func 方法名(){/*这个是函数,所以是函数名(这里为了判断)*/}
func (实例名 对象名) 方法名(){//这个是方法
}

(实例名 对象名): 体现出方法和对象有绑定关系

package main
import "fmt"type User struct{//变量名大写可以让其他方法可以访问到这个属性Name string
}func (u User) test() {fmt.Println(u)
}func main(){//创建结构体实例、对象、变量var u *User = &User{"我"}u.test()
}

方法注意事项

  • 结构体类型是值类型,在方法调用中,遵守值类型传递机制,是值拷贝传递方式
package mainimport "fmt"type User struct{Name string;
}func (u User) test(){u.Name = "大佬们"fmt.Println(u.Name)//大佬们
}func main(){var u Useru.Name = "陈天羽"u.test()fmt.Println(u.Name)//陈天羽
}

意思是这个值的变化只有在方法中改变(值拷贝)

  • 如程序员希望在方法中,改变结构体变量的值,可以通过结构体指针的方式来处理
package mainimport "fmt"type User struct{Name string;
}func (u *User) test(){ //指针类型User(*u).Name = "大佬们好"fmt.Println(u.Name)//大佬们好
}func main(){var u Useru.Name = "陈天羽"(&u).test()//传递的是指针变量地址fmt.Println(u.Name)//大佬们好
}

go语言可以简化

package mainimport "fmt"type User struct{Name string;
}func (u *User) test(){//对于前者来说就是改变了传入的对象值u.Name = "大佬们好"fmt.Println(u.Name)//大佬们好
}func main(){var u User*u.Name = "陈天羽"u.test()fmt.Println(u.Name)//大佬们好
}
  • Golang中的方法作用在指定的数据类型上的,和指定的数据类型绑定,因此自定义类型,都可以有方法,而不是仅仅是struct,比如int,float都可以有方法
package mainimport "fmt"type integer int //给int类型起别名func (i integer) print(){fmt.Println("i = ",i)
}func main(){var i integer = 20i.print()
}

在这里插入图片描述

如果方法里修改参数,得这么写

package mainimport "fmt"type integer intfunc (i *integer) print(){*i = 30fmt.Println("i = ",i)
}func main(){var i integer = 20i.print()fmt.Println(i)
}

在这里插入图片描述

相关内容

热门资讯

王毅:日本现职领导人讲了不该讲... 据外交部网站,11月19日至22日,中共中央政治局委员、外交部长王毅应邀赴吉尔吉斯斯坦、乌兹别克斯坦...
陕西兴平失联的12岁双胞胎姐妹... 据大风新闻,11月21日晚7时17分,陕西兴平一对12岁的双胞胎姐妹从家里外出。走的时候还穿着蓝色校...
原创 中... 中国再下一令,日本却辗转从韩国口中才得知这个噩耗,高市有点坐不住了,关键时刻放出猛料,要把美国拉下水...
公园掰手腕致骨折起诉索赔被驳回 公园内一场普通的掰手腕,竟导致手臂骨折、花费数万元医疗费。近日,江苏省苏州工业园区人民法院审理了一起...
护航浙商出海发展 浙江省涉外法... 中新网杭州11月23日电 (钱晨菲 吴怡欣)11月23日,浙江省涉外法律服务合作对接会在杭州举行,浙...
吕文君社媒庆祝夺冠:不只是海港... 2025赛季中超联赛于昨日正式落幕,上海海港队凭借出色的表现,成功捧起了冠军奖杯,成为了中超历史上又...
日本政府顾问:无需等到160关... 日本政府顾问表示,高市早苗政府对日元干预将采取更积极姿态,以抑制日元疲软带来的通胀压力,干预门槛可能...
被摄影师起诉侵权 视觉中国公开... 来源:每日经济新闻 持续两年多的摄影师起诉视觉中国(000681.SZ)侵权一案近日迎来进展。 法...
《哪吒2》被质疑过多使用动捕技... 搜狐娱乐讯 22日,奥斯卡公开的最佳动画长片奖“符合参评资格”大名单中没有《哪吒之魔童闹海》,引发热...
为了少付合同款,湖南一公司诉讼... 华声在线11月23日讯(文/视频 全媒体记者 杨昱 通讯员 胡云淞)为了少支付40万元合同款及利息,...