golang是面向对象语言,但是他并没有class之类的关键字,他是通过struct和interface组合实现了面向对象的概念。
面向对象的函数,我们一般要传对象指针,为什么呢?因为函数一般是操作对象的属性的,而只有全对象指针时,对象的属性才会被改变,否则不会改变对象属性本身。例子后续补上
转载请注明出处:http://www.cnblogs.com/SSSR/p/6351661.html
在golang中面向对象的实现顺序:
1.先定义struct,是对象的属性值,如:
type Person struct {
id int
name string
}
2.定义对象需要实现的函数,如:
func (self Person) codingEveryday() string {
return fmt.Sprintf("user %d, %s write bug every day.", self.id, self.name)
}
3.定义接口,选择不同的函数,定义很多个接口(不同的接口适应不同的需求,还可以起到保护函数的安全性),如:
type CodeMonkey interface {
codingEveryday() string
}
4.将struct实例化,然后赋值给接口,就可以通过接口参数调用struct(对象)函数,如:
var monkey CodeMonkey = Person{1, "Tom"}
fmt.Println(monkey.codingEveryday())
5.关于继承,我觉得可能是体现在struct(对象)定义的时候使用的匿名变量上,这个还没有深入研究,等研究明白了补充上。
以上为个人理解,如有错误还请指正。
实例:
interface.go
package interfacelearning import "fmt" type CodeMonkey interface { codingEveryday() string } type Parent interface { washingDiaper() string } type TwoPeople interface{ codingEveryday() string washingDiaper() string } type Person struct { id int name string } func (self Person) codingEveryday() string { return fmt.Sprintf("user %d, %s write bug every day.", self.id, self.name) } func (self Person) washingDiaper() string { return fmt.Sprintf("user %d, %s take care of his baby.", self.id, self.name) } func MonkeyFather() { var monkey CodeMonkey = Person{1, "Tom"} fmt.Println(monkey.codingEveryday()) var father Parent = Person{2, "John"} fmt.Println(father.washingDiaper()) var two TwoPeople=Person{3, "yuzp"} fmt.Println(two.codingEveryday()) fmt.Println(two.washingDiaper()) }
interface_test.go
package interfacelearning import "fmt" import "testing" var print=fmt.Println func TestMonkeyFather(t *testing.T){ MonkeyFather() print("这是一个测试!") }