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)
上一篇 2022年2月15日 下午10:00
下一篇 2022年2月15日 下午11:00


相关推荐

  • Java后台开发知识一览

    Java后台开发知识一览Java后台开发知识一览1、后端WEB服务器:Weblogic、Tomcat、WebSphere、JBoss、Jetty核心框架:SpringFramework分布式服务框架Dubbo(感谢@浅浅浅丿忧伤指正)安全框架:ApacheShiro视图框架:SpringMVC服务端验证:Hibernate+Validator布局框架:SiteMesh工作流…

    2022年7月8日
    19
  • STM32驱动1602A 8086协议[通俗易懂]

    STM32驱动1602A 8086协议[通俗易懂]本来想学I2C发现1602上没有I2C的接口,他是8086并口的就先把它搞了//1602的外设文件#include“lcd1602.h”#include“sys.h”#include“delay.h”#include“stdio.h”voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;R…

    2026年2月12日
    4
  • python获取文件名不含后缀名_python文件扩展名主要有

    python获取文件名不含后缀名_python文件扩展名主要有获取文件的后缀名有好几种方法:第一种:splittext()方法os.path.splittext(path)[-1]第二种:endswith()方法path=”test_user_info.py”bool=path.endswith(“.py”)print(bool)第三种:判断后缀名是否在字符串中(这种会存在误判,若是.pyx后缀,一样会打印True,前面两种不会)path=”test_user_info.py”if”.py”inpath:

    2026年2月18日
    7
  • getComputedStyle与currentStyle[通俗易懂]

    getComputedStyle与currentStyle[通俗易懂]本文参考https://developer.mozilla.org/en-US/docs/Web/API/Window.getComputedStyle1.简介  getComputedStyle是window下的一个全局函数,可以获取元素真正使用的样式。2.语法  varstyle=window.getComputedStyle(element[,ps

    2022年7月14日
    22
  • Django(1)初识Django「建议收藏」

    Django(1)初识Django「建议收藏」前言Django是一个开放源代码的Web应用框架,由Python写成,最初用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站,即CMS(内容管理系统)软件,于2005年7月在BSD许可证下发布,这

    2022年7月28日
    5
  • 第1坑 pycharm里的python解释器路径问题

    第1坑 pycharm里的python解释器路径问题我的 python 入门踩坑记录 成功安装 python3 并运行了第一条代码后 又继续下载安装了 pycharm 一打开 pycharm 就疯狂弹出 ModifySetup 通过网上的搜索 得知了问题所在 但是因为不熟悉 所以把两个软件都卸载了重新安装 安装 python 的时候 学聪明了 自己选择了安装路径 并且改了个简单的名字 好找 再到安装 pycharm 的时候 听从建议 把它装到了 D 盘 因为需要占较大内存空间 重新安装之后 pycharm 的路径选择那里自动出现了 python3 的路径 接下来就直接选择 然后

    2026年3月26日
    2

发表回复

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

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