golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但是他有一个类似功能的结构嵌入
type User struct{
name string
age int
address string
}
user:= User{name:"测试",age:10}
user.address="广州市"
f.Println(user)
person:= struct {//匿名结构
name string
age int
}{name:"匿名",age:1}
f.Println("person:",person)
- 函数中结构体作为参数,如果不是用结构指针,函数内参数属性的改变不影响原来对象的属性的改变
//值拷贝,不改变原来的User对象值
func us(user User){
user.name="值拷贝";
user.age=12
user.address="珠海市"
f.Println("user in us:",user)
}
//声明调用
user:=User{}
us(user)
//指针,改变原来的User对象值
func use(user *User){
user.name="指针"
user.age=15
user.address="深圳市"
f.Println("user in use:",*user)
}
//声明调用
user:=User{}
use(&user)
- go语言中虽然没有继承,但是可以结构内嵌,达到类似继承的效果
type Info struct {
sex int
name string
age int
address string
}
type User struct{
like string
Info
}
type Admin struct {
unlike string
Info
}
user:= User{}
user.sex=0
user.address="广州市"
user.like="游戏"
f.Println(user)
admin:= Admin{Info:Info{sex:1}}//还可以这样声明一些属性值,因为Info是结构体,匿名,所以需要这样声明
admin.address="广州市"
admin.unlike="游戏"
f.Println(admin)
- 如果嵌入结构的字段和外部结构的字段相同,那么,想要修改嵌入结构的字段值需要加上外部结构中声明的嵌入结构名称
type Info struct {
sex int
name string
age int
address string
}
type User struct{
like string
sex int
Info
}
user:=User{}
user.sex=1//这里修改的外部结构User里面的sex字段值
user.Info.sex=2//这里修改的是嵌入结构Info的sex字段值
golang中方法,没有重载概念,绑定不同的结构体,即使方法名称相同,也可以编译
type User struct{
like string
sex int
Info
}
type Info struct {
sex int
name string
age int
address string
}
type Admin struct {
unlike string
Info
}
func (user *User) uMethod(age int)User{//方法名uMethod,指针绑定
user.age=age
return *user
}
func (admin *Admin) uMethod(age int)Admin{//方法名uMethod,指针绑定
admin.age=age
return *admin
}
user:=User{}//调用绑定User的uMethod
user.uMethod(100)
f.Println(user.age)
admin:=Admin{}//调用绑定Admin的uMethod
admin.uMethod(50)
f.Println(admin.age)
- 在同一个packge中,结构体的字段都是公共的,即使声明的是小写私有的字段