一、结构体
go语言中的结构体与C的结构体是非常类似的。
1、定义一个结构体:
type Person struct {
name string
sex string
age int
}
2、结构体变量初始化
package main
import "fmt"
type Person struct {
name string
sex string
age int
}
func main() {
//第一种:通过直接定义变量类型,再依次给成员赋值
var p Person
p.name = "shixinke"
p.sex = "M"
p.age = 29
//第二种:通过new函数来初始化
p2 := new(Person)
p2.name = "golang"
//第三种:通过类似于面向对象的构造函数的形式来实始化
p3 := Person {name:"Hanmei", sex:"F", age :28}
fmt.Printf("姓名:%s, 性别:%s, 年龄:%d ", p.name, p.sex, p.age)
fmt.Printf("姓名:%s, 性别:%s, 年龄:%d ", p2.name, p2.sex, p2.age)
fmt.Printf("姓名:%s, 性别:%s, 年龄:%d ", p3.name, p3.sex, p3.age)
}
二、接口
go语言中的接口与面向对象语言(如PHP或JAVA)的接口是类似的,定义一种规范,需要实现接口的类来实现功能,但go语言的接口也有不一样的地方,go语言上没有显式的说明某个对象实现了某个接口,而是如果某个对象实现了这个接口的所有方法,那么可以说这个对象实现了这该接口
type Web interface {
request() map[string] string
response() string
}
三、通过结构体模拟面向对象
go语言中没有类似于PHP/JAVA中的class,也没有像Javascript中的基于原型的对象,当然也没有像lua中基于元表的表对象,看下面的例子
package main
import "fmt"
//定义一个基类(编程类)
type Programming struct {
desc string
version string
ref int
}
//定义一个Web编程的接口
type Web interface {
request() map[string] string
response() string
}
//定义一个名叫PHP的编程语言类
type PHP struct {
//有点类似于面向对象中的继承,但是却又不一样(有一点像PHP中的traits),在这里引入基类Programming
Programming
hashTables map[string] string
}
//定义一个基类函数(与面向对象的方法定义不同,它在函数名前指定对象即可认定它从属的类)
func (w *Programming) getRef() int{
return w.ref
}
//定义一个子类函数
func (p *PHP) getRef() int {
return p.ref+1
}
//定义一个子类函数,实现Web这个接口的request函数
func (p *PHP) request() map[string]string {
return map[string]string{"charset":"utf-8", "url":"/"}
}
//定义一个子类函数,实现Web这个接口的response这个函数
func (p *PHP) response() string {
return "server running"
}
//定义一个子类函数echo
func (p *PHP) echo(str string) {
fmt.Println(p.desc+" echo:"+str)
}
func main() {
//初始化PHP这个类,这里类似于把Programming当作一个PHP类的成员
phpweb := PHP{Programming{"PHP", "7.1", 1}, map[string]string{"engine":"zend"}}
//desc这个属性是由基类对象来的
fmt.Println(phpweb.desc)
fmt.Println(phpweb.version)
//这个hashTables属性是类本身的
fmt.Println(phpweb.hashTables["engine"])
phpweb.echo("web programming")
//方法重写
fmt.Println(phpweb.ref)
//调用是PHP重写的getRef函数,而不是Programming的getRef函数
fmt.Println(phpweb.getRef())
//phpweb实现了web这个接口所有的方法,那么就说明phpweb实现了Web这个接口
fmt.Println(phpweb.request()["url"])
fmt.Println(phpweb.response())
}