go语言结构体与面向对象

一、结构体

go语言中的结构体与C的结构体是非常类似的。

1、定义一个结构体:
  1. type Person struct {
  2. name string
  3. sex string
  4. age int
  5. }
2、结构体变量初始化
  1. package main
  2. import "fmt"
  3. type Person struct {
  4. name string
  5. sex string
  6. age int
  7. }
  8. func main() {
  9. //第一种:通过直接定义变量类型,再依次给成员赋值
  10. var p Person
  11. p.name = "shixinke"
  12. p.sex = "M"
  13. p.age = 29
  14. //第二种:通过new函数来初始化
  15. p2 := new(Person)
  16. p2.name = "golang"
  17. //第三种:通过类似于面向对象的构造函数的形式来实始化
  18. p3 := Person {name:"Hanmei", sex:"F", age :28}
  19. fmt.Printf("姓名:%s, 性别:%s, 年龄:%d ", p.name, p.sex, p.age)
  20. fmt.Printf("姓名:%s, 性别:%s, 年龄:%d ", p2.name, p2.sex, p2.age)
  21. fmt.Printf("姓名:%s, 性别:%s, 年龄:%d ", p3.name, p3.sex, p3.age)
  22. }

二、接口

go语言中的接口与面向对象语言(如PHP或JAVA)的接口是类似的,定义一种规范,需要实现接口的类来实现功能,但go语言的接口也有不一样的地方,go语言上没有显式的说明某个对象实现了某个接口,而是如果某个对象实现了这个接口的所有方法,那么可以说这个对象实现了这该接口

  1. type Web interface {
  2. request() map[string] string
  3. response() string
  4. }

三、通过结构体模拟面向对象

go语言中没有类似于PHP/JAVA中的class,也没有像Javascript中的基于原型的对象,当然也没有像lua中基于元表的表对象,看下面的例子

  1. package main
  2. import "fmt"
  3. //定义一个基类(编程类)
  4. type Programming struct {
  5. desc string
  6. version string
  7. ref int
  8. }
  9. //定义一个Web编程的接口
  10. type Web interface {
  11. request() map[string] string
  12. response() string
  13. }
  14. //定义一个名叫PHP的编程语言类
  15. type PHP struct {
  16. //有点类似于面向对象中的继承,但是却又不一样(有一点像PHP中的traits),在这里引入基类Programming
  17. Programming
  18. hashTables map[string] string
  19. }
  20. //定义一个基类函数(与面向对象的方法定义不同,它在函数名前指定对象即可认定它从属的类)
  21. func (w *Programming) getRef() int{
  22. return w.ref
  23. }
  24. //定义一个子类函数
  25. func (p *PHP) getRef() int {
  26. return p.ref+1
  27. }
  28. //定义一个子类函数,实现Web这个接口的request函数
  29. func (p *PHP) request() map[string]string {
  30. return map[string]string{"charset":"utf-8", "url":"/"}
  31. }
  32. //定义一个子类函数,实现Web这个接口的response这个函数
  33. func (p *PHP) response() string {
  34. return "server running"
  35. }
  36. //定义一个子类函数echo
  37. func (p *PHP) echo(str string) {
  38. fmt.Println(p.desc+" echo:"+str)
  39. }
  40. func main() {
  41. //初始化PHP这个类,这里类似于把Programming当作一个PHP类的成员
  42. phpweb := PHP{Programming{"PHP", "7.1", 1}, map[string]string{"engine":"zend"}}
  43. //desc这个属性是由基类对象来的
  44. fmt.Println(phpweb.desc)
  45. fmt.Println(phpweb.version)
  46. //这个hashTables属性是类本身的
  47. fmt.Println(phpweb.hashTables["engine"])
  48. phpweb.echo("web programming")
  49. //方法重写
  50. fmt.Println(phpweb.ref)
  51. //调用是PHP重写的getRef函数,而不是Programming的getRef函数
  52. fmt.Println(phpweb.getRef())
  53. //phpweb实现了web这个接口所有的方法,那么就说明phpweb实现了Web这个接口
  54. fmt.Println(phpweb.request()["url"])
  55. fmt.Println(phpweb.response())
  56. }