一、自定义结构
定义结构:type 结构名称 struct
*注:go语言中是没有类这回事,但是它使用了其他方式来充当类,比如一个文件xxx.go那么就属于一个xxx类。go语言对命名方式做了一点智能化处理,如果名字是以小写开头的则只能在包范围内访问,如果是以大写字母开头的,则属于公开,类似于java、php中的public。
1.1、定义结构
type User struct { id int name string } type Admin struct { user User role string }
1.2、赋值
var user User user.id = 1 user.name = "alan" fmt.Println(user) lisa := User{2, "lisa"} lily := User{id:2,name: "lily"} fmt.Println(lisa) fmt.Println(lily)
二、方法
- 方法的定义方法实际上也是函数,只是在声明时,在关键字 func 和方法名之间增加了一个参数
- 普通的函数定义 func 方法名(入参) 返回值
- 自定义类型的方法定义 func (接收者) 方法名 (入参) 返回值
- 方法的值传递和指针传递
- func (u user) notify() 拷贝一份 user
- func (u *user) changeEmail(newEmail string) 传递指针(即地址),内部改变会影响外部
//定义一个类型 type User struct { id int name string } //定义3个方法 func (u User) getName() string { return u.name; } func (u *User) setName(name string) { u.name = name } func (u User) println() { fmt.Println(u) }//测试方法 func test3() { var user User user.id = 1 user.name = "alan" fmt.Println(user.getName())// alan user.setName("Alan2") user.println()// 1 Alan2 }
注意:“再强调一次,println() 操作的是一个副本,只不过这次操作的是从 user 指针指向的值的副本。”
三、嵌入类型
- Go 语言允许用户扩展或者修改已有类型的行为。这个功能是通过嵌入类型 type embedding 完成的。嵌入类型是将已有的类型直接声明在新的结构类型里。被嵌入的类型被称为新的外部类型的内部类型。
- Java 通常可以通过继承或组合的方式实现嵌入类型要实现的功能。
- “要嵌入一个类型,只需要声明这个类型的名字就可以了”,即 user 而不是 u user, u user 是声明字段
- 内部类型的方法可以被提升到外部类型直接使用
*注:嵌入类型实际上就是go的多态,类似于java的继承。
//定义一个user基础类型 type User struct { id int name string } //定义个admin基础类型 type Admin struct { user User role string } //定义一个admin2嵌入user类型 type Admin2 struct { User role string }//测试方法 func test4() { var admin Admin;//定义一个admin对象 admin.user = User{id: 1, name: "alan"}; admin.role = "Administrator" admin.setName("test") //错误,这里的admin并不会继承user中的方法 admin2 := Admin2{role: "Administrator"}; admin2.id = 1 admin2.name = "alan" admin2.getName()//这里的admin2对象会自动继承user中的方法 admin2.println() }//给User类型添加getName函数 func (u User) getName() string { return u.name; } //给User类型添加setName函数 func (u *User) setName(name string) { u.name = name } //给User类型添加println函数 func (u User) println() { fmt.Println(u) }