Golang
中的struct
有点跟Java
中的类相似.
struct
管他什么特性不特性的,先来段代码.看看跟学过的其他语言有啥区别.
package main
import (
"fmt"
)
type Person struct {
name string
age int
}
type Student struct {
grade string
Person //匿名字段
}
func main() {
stu := new(Student)
var stu2 Student = Student{"一年级", Person{"Arya Stark", 15}}
stu3 := Student{grade: "二年级", Person: Person{"Magicer", 32}}
stu.grade = "三年级"
stu.Person = Person{"Jon Snow", 33}
fmt.Println(stu) //输出 &{三年级 {Jon Snow 33}}
//在这里可以直接stu.name获得匿名字段的值,也可以stu.Person.name
fmt.Println(stu.name, stu.age, stu.grade, stu.Person) //输出Jon Snow 33 三年级 {Jon Snow 33}
fmt.Println(stu2) //输出 {一年级 {Arya Stark 15}}
fmt.Println(stu3) //输出 {二年级 {Magicer 32}}
}
Golang
中没有继承,但是我们可以使用组合的方式来实现和继承类似的效果.比如上面的代码.我们不能通过显示的让Student
继承自Person
但是我们可以通过组合的方式来得到这种效果.
type
我们可以通过type关键字来定义一个类型.比如这里的Person
类型和Student
类型.我们还可以通过type
关键字来为int
等来设置别名 如type grade int
.通过type关键字来定义的
方法
先来段跟方法有关的代码,看下Golang
中的方法是个什么鬼.
package main
import (
"fmt"
)
type Student struct {
name string
age int
}
//值方法
//当我们不需要在方法中使用这个结构的值的时候, 可以使用_
func (_ Student) lean() {
fmt.Println("Student lean")
} //指针方法
//这里的(stu *Student)用来表示这个方法是属于谁的.可以位于不同的文件中,只要是在同一个包中就可以
//在这里我们的stu是Student的指针,只有这时候我们才可以修改p的值,
// 当使用(stu Student)时,我们使用的是一份copy.
func (stu *Student) eat(food string) {
fmt.Println(stu.name, " eat ", food, "\t ", stu)
}
func main() {
stu := new(Student)
stu.eat("Apple") //student eat Apple &{ 0}
stu.lean() // Student lean
var stu2 Student = Student{"Jason", 22}
fmt.Println(stu2) //{Jason 22}
stu2.eat("Apple") //Jason eat Apple &{Jason 22}
}
我们看到上面Student
中的name
和age
字段都是非导出字段.那么如果我们要在不同的包中对其的值进行修改怎么办呢?
这个时候我们就可以写上跟Java
中setter
和getter
方法.如下
func (stu *Student) setName(name string) {
stu.name = name
}
func (stu *Student) getName() string {
return stu.name
}
一个Golang
初学者,记录的东西难免有错误,还望多多指出啊.谢谢.