Google资深工程师深度讲解Go语言–面向对象(四)[通俗易懂]

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

大家好,又见面了,我是全栈君。

一.结构体和方法

面向对象

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

结构的创建

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

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

使用指针作为方法接受者

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

值接受者vs指针接受者

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

Google资深工程师深度讲解Go语言--面向对象(四)[通俗易懂]

package main

import "fmt"

type treeNode struct {
	value       int
	left, right *treeNode //指针
}

//自定义工厂函数
func createNode(value int) *treeNode {
	return &treeNode{value: value} //返回局部变量的地址
}

/**
go语言所有参数传值
为结构定义方法
显示定义和命名方法接受者
 */
//值接受
func (node treeNode) print() {
	fmt.Print(node.value," ")
}

//指针接受
func (node *treeNode) setValue(value int) {
	if node==nil {
		fmt.Println("setting value to nil node ")
		return
	}
	node.value = value
}

//子树遍历
//中式遍历:先左再中再右

func (node *treeNode)traverse()  {
	if node==nil {
		return
	}
	node.left.traverse()
	node.print()
	node.right.traverse()

}


func main() {
	var root treeNode

	root = treeNode{value: 3}
	root.left = &treeNode{}             //左子树 取地址
	root.right = &treeNode{5, nil, nil} //右子树
	root.right.left = new(treeNode)
	//fmt.Println(root)
	root.left.right = createNode(2)

	root.right.left.setValue(4)
	root.right.left.print()
	fmt.Println()

	//root.print()
	//root.setValue(100)
	//
	//var pRoot *treeNode
	//pRoot.setValue(200)
	//pRoot=&root
	//pRoot.setValue(300)
	//pRoot.print()

	fmt.Println()

	root.traverse()//0 2 3 4 5
	//pRoot:=&root
	//pRoot.print()
	//pRoot.setValue(200)
	//pRoot.print()

	/*nodes:=[]treeNode{
		{value:3},
		{},
		{6,nil,&root},
	}
	fmt.Println(nodes)*/

}

二,包和封装

针对包来说

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

包:

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

import "fmt"

func main() {
	//one:=0
	one,two:=1,2
	one,two=two,one //交换变量值
	fmt.Println(one,two)
}

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

  • 定义别名
  • 使用组合

queue.go

package queue

type Queue []int

func (q *Queue) Push(v int) {
	*q = append(*q, v)
}

func (q *Queue) Pop() int {
	head := (*q)[0]
	*q = (*q)[1:]
	return head
}

func (q *Queue) IsEmpty() bool {
	return len(*q) == 0
}

mian.go 文件

package main

import (
	"../../queue"
	"fmt"
)

func main() {
	q := queue.Queue{1} //队列先进先出

	q.Push(2)
	q.Push(3)
	fmt.Println(q.Pop())     //1
	fmt.Println(q.Pop())     //2
	fmt.Println(q.IsEmpty()) //false
	fmt.Println(q.Pop())     //3
	fmt.Println(q.IsEmpty()) //true

}

四.gopath环境变量

  • 默认在~/go(unix,linux),%userprofile%\go(windows):
  • 例如GOROOT=/usr/local/go #gosetup   GOPATH=/Users/liutao/go #gosetup
  • 官方推荐:所有项目和第三方库都放在同一个gopath下
  • 也可以将每个项目放在不同的gopathGoogle资深工程师深度讲解Go语言--面向对象(四)[通俗易懂]

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111719.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库常见面试题(附答案)

    数据库常见面试题(附答案)1.事务四大特性原子性,要么执行,要么不执行隔离性,所有操作全部执行完以前,其它会话不能看到过程一致性,事务前后,数据总额一致持久性,一旦事务提交,对数据的改变就是永久的2.数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别脏读:事务B读取事务A还没有提交的数据不可重复读:两次事务读的数据不一致幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看

    2022年5月2日
    75
  • spring整合mybatis详细步骤

    spring整合mybatis详细步骤spring整合mybatis的详细步骤

    2022年5月5日
    39
  • 什么是.so文件_安卓so文件作用

    什么是.so文件_安卓so文件作用so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据linux下何谓.so文件:用过windows的同学应该都知道.dll文件吧,这二者有什么共通之处呢,其实.so文件就跟.dll文件差不多 一般来说.so文件就是常说的动态链接库,都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码) Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库那么.so文件是怎么用的呢?forexample:(1)动态库的编译.

    2022年9月19日
    3
  • thinkphp5中的配置如何使用

    thinkphp5中的配置如何使用

    2021年6月16日
    77
  • supermemo怎么用_mono效果器板

    supermemo怎么用_mono效果器板Supermemo是个不错的背单词的软件(本人并不代理该软件,并非给它做广告),但实际上它可以用来记忆其它的材料。这个软件写得非常早,1992与就有DOS版本,可使用习惯与微软常见软件的风格很不一样,

    2022年8月6日
    14
  • cocos 3.0 一键打包android平台应该注意的细节

    cocos 3.0 一键打包android平台应该注意的细节

    2021年11月17日
    71

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号