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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 移动端触摸touchstart监听事件[通俗易懂]

    移动端触摸touchstart监听事件[通俗易懂]click、mousedown等事件适用于PC端,在移动端会有一定时间的延迟,所以更好的优化移动端体验,要用touch事件,1、首先要添加一个监听事件,监听移动端行为element.addEventListener(event,function,useCapture)我这里是针对浏览器行为,所以监听事件为//添加触摸监听事件,如果手指触摸到阴影…

    2022年6月19日
    70
  • CSS+HTML 顶部导航栏实现「建议收藏」

    CSS+HTML 顶部导航栏实现「建议收藏」导航栏的实现、固定顶部导航栏、二级菜单实现效果图:代码实现:<html><head><styletype="text/css">.top{/*设置宽度高度背景颜色*/height:50px;width:100

    2022年5月28日
    22
  • mysql截取中文字符_mysql截取字符串函数-Go语言中文社区

    mysql截取中文字符_mysql截取字符串函数-Go语言中文社区目标将rull字段值的0.1g*14粒/1.5mg*30片/100ml(氨甲环酸0.5g:氯化钠0.84g)*1瓶中的mg/g/ml开头的数字取出设置到另外一个字段上去SELECTidfromsheet2whererulllike’%ml%’;SELECTid,count,LEFT(rull,LOCATE(‘g’,rull)-1)fromsheet2w…

    2022年5月5日
    130
  • 响应式久草编程基础教程:久草Spring Boot 与 Lettuce 在线整合「建议收藏」

    响应式久草编程基础教程:久草Spring Boot 与 Lettuce 在线整合「建议收藏」本文主要介绍响应式编程访问Redis,以及SpringBoot与Lettuce的整合使用。Lettuce是可扩展性线程安全的Redis客户端,用于同步、异步和响应式使用。如果多个线程避免阻塞和事务性操作(例如BLPOP和MULTI/EXEC),则它们可以共享一个连接。Lettuce是基于Netty构建的。支持很多高级的Redis特性。根据SpringDataRedis2.0的更新的消息显示,SpringDataRedis不再支持JRedis的驱动,

    2022年10月19日
    0
  • MATLAB R2019b超详细安装教程(附完整安装文件)

    MATLAB R2019b超详细安装教程(附完整安装文件)摘要:本文详细介绍MATLABR2019b的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用。从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用。本文目录包括:下载安装包、正式安装步骤、复制替换文件、创建快捷方式。

    2022年6月11日
    226
  • SQL学习收获与心得

    SQL学习收获与心得SQL或结构化查询语言是一种语言,旨在允许技术和非技术用户查询,操作和转换关系数据库中的数据。由于其简单性,SQL数据库为数百万个网站和移动应用程序提供安全且可扩展的存储。有许多流行的SQL数据库,包括MySQL,MSSQL和Oracle等等。所有这些都支持通用的SQL语言标准,这是该网站将要教授的内容,但每个实现可以在它支持的附加功能和存储类型方面有所不同。基本的sql语句:选择:se…

    2022年8月21日
    5

发表回复

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

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