为了账号安全,请及时绑定邮箱和手机立即绑定

【Go语言干货】从入门说起,你不得不要知道的面向对象

标签:
Go 数据结构

结构体和方法

  • go语言仅支持封装,不支持继承和多态
  • go语言没有class,只有struct
  • 不论地址还是结构本身,一律使用.来访问成员

图片描述

  • 使用自定义工厂函数
  • 注意返回了局部变量的地址!
    • c++局部变量是分配在栈上面的,函数退出,局部变量销毁。如果要传出去,我们必须在堆上分配,手动释放

图片描述

type TreeNode struct{
	Left,Right *TreeNode
	Value int
}
func (node Node) Print() {
	fmt.Print(node.Value, " ")
}

func (node *Node) SetValue(value int) {
	node.Value = value
}

func CreateNode(value int) *Node {
	return &Node{Value: value}
}


func main() {
	var root treeNode
	fmt.Println(root) nil nil 0
}

给结构体定义方法

  • 显示定义和命名方法接收者
  • 只有使用指针才可以改变结构内容
  • nil 指针也可以调用方法!
func(node TreeNode) print(){
	fmt.Print(node.Value)
}
func(node *TreeNode) setValue(value int) {
	if node==nil{
		fmt.Println("Setting value to nil"+ "node.Ignored.")r
	return
	}
	node.Value=value
}



值接收者和指针接收者

  • 要改变内容必须使用指针接收者
  • 结构过大也考虑使用指针接收者
  • 一致性:如有指针接收者,最好都是指针接收者
    • 值接收者是go语言特有
    • 值/指针接收者均可接收值/指针
func (node *Node) Traverse() {
	node.TraverseFunc(func(n *Node) {
		n.Print()
	})
	fmt.Println()
}

func (node *Node) TraverseFunc(f func(*Node)) {
	if node == nil {
		return
	}

	node.Left.TraverseFunc(f)
	f(node)
	node.Right.TraverseFunc(f)
}

func (node *Node) TraverseWithChannel() chan *Node {
	out := make(chan *Node)
	go func() {
		node.TraverseFunc(func(node *Node) {
			out <- node
		})
		close(out)
	}()
	return out
}

封装

  • 名字一般使用CamelCase
  • 首字母大写:public
  • 首字母小写:private
    • 每个目录一个包
    • main包含可执行入口
    • 为结构定义的方法必须放在同一个包内
    • 可以是不同文件

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

  • 定义别名
  • 使用组合

GOPATH环境变量

  • 默认在~/go(unix,linux),%USERPROFILE%\go(windows)
  • 官方推荐:所有项目和第三方库都放在同一个GOPATH下
  • 也可以将每个项目放在不同的GOPATH

go get 获取第三方库

  • 使用gopm来获取无法下载的包
  • go build 来编译
  • go install 产生pkg文件和可执行文件
  • go run直接编译运行
点击查看更多内容
3人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
1.6万
获赞与收藏
1807

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消