Google资深工程师深度讲解Go语言--面向对象(四)

举报
lxw1844912514 发表于 2022/03/26 23:36:39 2022/03/26
【摘要】 一.结构体和方法 面向对象 go语言仅支持封装,不支持继承和多态go语言没有class,只有struct结构体 结构的创建 不论地址还是结构本身,一律使用.(点)来访问成员使用自定义工厂函数注意返回了局部变量的地址go语言没有构造函数 结构创建在堆上?栈上:   不需要知道 垃圾回收 使用指针作为方法接受者 ...

一.结构体和方法

面向对象

  • go语言仅支持封装,不支持继承和多态
  • go语言没有class,只有struct结构体

结构的创建

  • 不论地址还是结构本身,一律使用.(点)来访问成员
  • 使用自定义工厂函数
  • 注意返回了局部变量的地址
  • go语言没有构造函数

结构创建在堆上?栈上:   不需要知道 垃圾回收

使用指针作为方法接受者

  • 只有使用指针才可以改变结构内容
  • nil指针也可以调用方法 

值接受者vs指针接受者

  • 要改变内容必须使用指针接受者
  • 结构过大也考虑使用指针接受者
  • 一致性:如有指针接受者,做好都是指针接受者(建议)
  • 值接受者是go语言特有,指针接受者其他语言都有
  • 值/指针接受者均可接受值/指针


  
  1. package main
  2. import "fmt"
  3. type treeNode struct {
  4. value int
  5. left, right *treeNode //指针
  6. }
  7. //自定义工厂函数
  8. func createNode(value int) *treeNode {
  9. return &treeNode{value: value} //返回局部变量的地址
  10. }
  11. /**
  12. go语言所有参数传值
  13. 为结构定义方法
  14. 显示定义和命名方法接受者
  15. */
  16. //值接受
  17. func (node treeNode) print() {
  18. fmt.Print(node.value," ")
  19. }
  20. //指针接受
  21. func (node *treeNode) setValue(value int) {
  22. if node==nil {
  23. fmt.Println("setting value to nil node ")
  24. return
  25. }
  26. node.value = value
  27. }
  28. //子树遍历
  29. //中式遍历:先左再中再右
  30. func (node *treeNode)traverse() {
  31. if node==nil {
  32. return
  33. }
  34. node.left.traverse()
  35. node.print()
  36. node.right.traverse()
  37. }
  38. func main() {
  39. var root treeNode
  40. root = treeNode{value: 3}
  41. root.left = &treeNode{} //左子树 取地址
  42. root.right = &treeNode{5, nil, nil} //右子树
  43. root.right.left = new(treeNode)
  44. //fmt.Println(root)
  45. root.left.right = createNode(2)
  46. root.right.left.setValue(4)
  47. root.right.left.print()
  48. fmt.Println()
  49. //root.print()
  50. //root.setValue(100)
  51. //
  52. //var pRoot *treeNode
  53. //pRoot.setValue(200)
  54. //pRoot=&root
  55. //pRoot.setValue(300)
  56. //pRoot.print()
  57. fmt.Println()
  58. root.traverse()//0 2 3 4 5
  59. //pRoot:=&root
  60. //pRoot.print()
  61. //pRoot.setValue(200)
  62. //pRoot.print()
  63. /*nodes:=[]treeNode{
  64. {value:3},
  65. {},
  66. {6,nil,&root},
  67. }
  68. fmt.Println(nodes)*/
  69. }

二,包和封装

针对包来说

  • 名字一般使用CamelCase
  • 首字母大写:public 公有
  • 首字母小写:private 私有

包:

  • 每个目录一个包
  • main包包含可执行入口(main 函数)
  • 为结构定义的方法必须放在同一个包内
  • 可以是不同的文件

  
  1. package main
  2. import "fmt"
  3. func main() {
  4. //one:=0
  5. one,two:=1,2
  6. one,two=two,one //交换变量值
  7. fmt.Println(one,two)
  8. }

如何扩充系统类型或者别人的类型

  • 定义别名
  • 使用组合

queue.go


  
  1. package queue
  2. type Queue []int
  3. func (q *Queue) Push(v int) {
  4. *q = append(*q, v)
  5. }
  6. func (q *Queue) Pop() int {
  7. head := (*q)[0]
  8. *q = (*q)[1:]
  9. return head
  10. }
  11. func (q *Queue) IsEmpty() bool {
  12. return len(*q) == 0
  13. }

mian.go 文件


  
  1. package main
  2. import (
  3. "../../queue"
  4. "fmt"
  5. )
  6. func main() {
  7. q := queue.Queue{1} //队列先进先出
  8. q.Push(2)
  9. q.Push(3)
  10. fmt.Println(q.Pop()) //1
  11. fmt.Println(q.Pop()) //2
  12. fmt.Println(q.IsEmpty()) //false
  13. fmt.Println(q.Pop()) //3
  14. fmt.Println(q.IsEmpty()) //true
  15. }

四.gopath环境变量

  • 默认在~/go(unix,linux),%userprofile%\go(windows):
  • 例如GOROOT=/usr/local/go #gosetup   GOPATH=/Users/liutao/go #gosetup
  • 官方推荐:所有项目和第三方库都放在同一个gopath下
  • 也可以将每个项目放在不同的gopath

 

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/108018287

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。