当前位置: 首页 > news >正文

成都网站建设yingrihe百度seo查询工具

成都网站建设yingrihe,百度seo查询工具,网站建设都怎么找客户的,wampserver 架设wordpress 主题错误go语言切片函数参数传递append()函数扩容 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 二叉树递归go代码: var ans [][]int func pathSum(root *TreeNode, targetSum int) ( [][…

go语言切片函数参数传递+append()函数扩容

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

二叉树递归go代码:

var ans [][]int
func pathSum(root *TreeNode, targetSum int) ( [][]int) {ans := make([][]int, 0) path := []int{}dfs(root, targetSum,path)return ans
}
func dfs(node *TreeNode, left int,path []int) {if node == nil {return}left -= node.Valpath = append(path, node.Val)if node.Left == nil && node.Right == nil && left == 0 {ans = append(ans, append([]int(nil), path...))//在二维切片中添加一维切片return}dfs(node.Left, left,path)dfs(node.Right, left,path)
}

我的疑惑由这道题的代码产生,可以看到在dfs递归函数中,使用了参数path切片作为变量,而学过Go的都知道切片slice是引用类型,那么在函数传递时是引用传递吗。
可以知道path记录的是目前遍历过的数据,而我的疑惑就是对切片path一直添加了数据,那么为什么作为参数传进path后,在下层递归函数中的修改不会影响到上层path,以下是我查阅许多资料的解释。

1.Go中切片的结构体

在这里插入图片描述
如图所示,切片结构体包含了三部分,第一部分是指向底层数组的指针,其次是切片的大小len和切片的容量cap。

2.切片的扩容机制

切片的容量(cap)表示切片可以使用的底层数组的最大长度。当切片的长度(len)超过了容量时,切片就会自动扩容,即分配一个更大的底层数组,并将原有的数据复制过去。这个过程是由append函数完成的,我们不需要手动操作。
根据Go语言源码中的注释,切片扩容的规则如下:

如果原始容量小于1024,则新容量是原始容量的2倍;
如果原始容量大于等于1024,则新容量是原始容量的1.25倍;
如果连续扩容5次,且没有触发上述两种情况,则新容量是原始容量的1.5倍;
如果分配失败,则触发内存溢出。

**切片在函数内部进行扩容或缩容操作时,会导致切片指向一个新的底层数组,此时在函数内部和外部就不再共享同一个底层数组了。**因此当追加超出原本容量时,再改变切片内容后,对原来的数组是没有影响的

3.Go中的append函数

在这里插入图片描述
在这里插入图片描述
如上图可以看到,如果进行append后,

  1. 切片没有进行扩容,那么会直接添加或修改切片指向底层数组中后一位的值,故底层数组会受到改变;
  2. 而如果进行扩容,则会导致切片指向一个新的底层数组,对原来的数组是没有影响的

4.Go函数传参只有值传递一种方式,传地址必须加上*——其实也是传地址变量的值

看过有些博客说Go中切片是传地址,但其实这是错误的,
Go官方文档声明:Go中函数传参只有传值,传地址必须加上*,这其实也是传地址变量的值

再回到切片作为函数参数的问题上,因为Go里面函数传参只有值传递一种方式,所以当切片作为参数时,其实也是切片的拷贝,但是在拷贝的切片中,其包含的指针成员变量的值是一样的,也就是说它们指向的底层数组数据源是一样,因此在调用函数内修改形参能影响实参。

通常,我们把在传值拷贝过程中,修改形参能直接修改实参的数据类型称为引用类型。
Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。

因为拷贝的内容有时候是非引用类型(int、string、struct等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map、slice、chan等这些),这样就可以修改原内容数据。

这里要注意的是:引用类型和传引用是两个概念。
在这里插入图片描述
在这里插入图片描述

总结:

slice切片或者array数组作为函数参数传递的时候,本质是传值而不是传地址。因为slice依赖其底层的array,修改slice本质是修改array,而array又是有大小限制,当超过slice的容量,即数组越界的时候,需要通过动态规划的方式创建一个新的数组块。把原有的数据复制到新数组,这个新的array则为slice新的底层依赖。

传值的过程复制一个新的切片,这个切片也指向原始变量的底层数组。函数中无论是直接修改切片,还是append创建新的切片,都是基于共享切片底层数组的情况作为基础,最外面的原始切片是否改变,取决于函数内的操作和切片本身容量,是否修改了底层数组。

  • 如果要修改切片的值,那么一定对底层数组做了修改,为影响到函数外的切片
  • 如果是append操作,则要看切片是否扩容
    • 切片没有进行扩容,那么会直接添加或修改切片指向底层数组中后一位的值,故底层数组会受到改变,函数外切片改变;
    • 而如果进行扩容,则会导致切片指向一个新的底层数组,一切修改都对函数外的原切片无影响
      .

当然,如果为了修改原始变量,可以指定参数的类型为指针类型。传递的就是slice的内存地址。函数内的操作都是根据内存地址找到变量本身。

递归代码分析

func dfs(node *TreeNode, left int,path []int) {if node == nil {return}left -= node.Valpath = append(path, node.Val)if node.Left == nil && node.Right == nil && left == 0 {ans = append(ans, append([]int(nil), path...))//在二维切片中添加一维切片return}dfs(node.Left, left,path)dfs(node.Right, left,path)
}

故在该递归函数dfs中,我们首先要知道,每次递归都是从左到右,递归完一条路径才会返回,故第一次递归时就会导致path达到叶子节点。且由path代表路径的定义,易知path的长度代表着当前遍历结点的深度
在每一次传递的参数path都是传的切片值,而不是path的地址,故都是不同的切片值,只是指向的底层数组一样,且每次在函数内部进行append时,可能扩容,也可能不扩容

  1. 如果append后导致path扩容,会导致切片指向一个新的底层数组,此时在函数内部path和外部path就不再共享同一个底层数组了,因此不会影响上层递归函数的path
  2. 如果append后没有导致path扩容,那么会直接添加或修改切片指向底层数组中后一位的值;
    • 如果是第一次遍历到当前深度,那么就会在底层数组中添加值,那么直接添加,并判断当前结点有无子树,若没有子树则加入ans中
    • 如果已经遍历过当前深度,那么应该修改底层数组的切片后一位的值,这样确实会影响path的底层数组,但对所求的答案ans没有影响,因为修改之前的path路径已经在之前的递归中添加进了ans中;对之后的递归中的path也没有影响,因为之后的path在遍历到当前深度进行append时也会修改该深度的path值

文章转载自:
http://dinncotroubled.bpmz.cn
http://dinncodipnet.bpmz.cn
http://dinncopneumonitis.bpmz.cn
http://dinncofirry.bpmz.cn
http://dinncoira.bpmz.cn
http://dinncocolorimetric.bpmz.cn
http://dinncohalling.bpmz.cn
http://dinncocagliari.bpmz.cn
http://dinnconelda.bpmz.cn
http://dinncoomar.bpmz.cn
http://dinncoscots.bpmz.cn
http://dinncosostenuto.bpmz.cn
http://dinncogalactosidase.bpmz.cn
http://dinncomar.bpmz.cn
http://dinncodisconformity.bpmz.cn
http://dinncoacidproof.bpmz.cn
http://dinncowaesucks.bpmz.cn
http://dinncoorthotropous.bpmz.cn
http://dinncogerminator.bpmz.cn
http://dinncooleandomycin.bpmz.cn
http://dinncohomemaker.bpmz.cn
http://dinncoprying.bpmz.cn
http://dinncoarmored.bpmz.cn
http://dinncoautohypnotism.bpmz.cn
http://dinncobrick.bpmz.cn
http://dinncoirl.bpmz.cn
http://dinncoxenolalia.bpmz.cn
http://dinncoparity.bpmz.cn
http://dinncodiaeresis.bpmz.cn
http://dinncononinductively.bpmz.cn
http://dinncosagely.bpmz.cn
http://dinncomcfd.bpmz.cn
http://dinncomonochord.bpmz.cn
http://dinncoflintlock.bpmz.cn
http://dinncocanst.bpmz.cn
http://dinncosubtracter.bpmz.cn
http://dinncoacetazolamide.bpmz.cn
http://dinncotiara.bpmz.cn
http://dinncobrassage.bpmz.cn
http://dinncorestrictionist.bpmz.cn
http://dinncoundivorced.bpmz.cn
http://dinncoarcover.bpmz.cn
http://dinncocoquettish.bpmz.cn
http://dinncoautocoherer.bpmz.cn
http://dinncotelephone.bpmz.cn
http://dinncoquintillion.bpmz.cn
http://dinncolymphadenoma.bpmz.cn
http://dinncosottish.bpmz.cn
http://dinncohomespun.bpmz.cn
http://dinncoharyana.bpmz.cn
http://dinncozoar.bpmz.cn
http://dinncoflyer.bpmz.cn
http://dinncoescalate.bpmz.cn
http://dinncoanimosity.bpmz.cn
http://dinncodysmetria.bpmz.cn
http://dinncowwf.bpmz.cn
http://dinncoprimitive.bpmz.cn
http://dinncoreplicate.bpmz.cn
http://dinncobribee.bpmz.cn
http://dinncooilcloth.bpmz.cn
http://dinncoarabism.bpmz.cn
http://dinncowoodpecker.bpmz.cn
http://dinncoindrawal.bpmz.cn
http://dinncounexpiated.bpmz.cn
http://dinncocordoba.bpmz.cn
http://dinncohorizon.bpmz.cn
http://dinncojaunce.bpmz.cn
http://dinncoalexin.bpmz.cn
http://dinncorecur.bpmz.cn
http://dinncosgml.bpmz.cn
http://dinncoukiyoe.bpmz.cn
http://dinncomanichee.bpmz.cn
http://dinncomanipulate.bpmz.cn
http://dinncodecile.bpmz.cn
http://dinncocoryphaeus.bpmz.cn
http://dinncocarousal.bpmz.cn
http://dinncoempaistic.bpmz.cn
http://dinncotetrasyllable.bpmz.cn
http://dinncodaddy.bpmz.cn
http://dinncolaud.bpmz.cn
http://dinncoautofill.bpmz.cn
http://dinncosavanna.bpmz.cn
http://dinncohelper.bpmz.cn
http://dinncotoyland.bpmz.cn
http://dinncomicrolens.bpmz.cn
http://dinncovocational.bpmz.cn
http://dinncopealike.bpmz.cn
http://dinncopolyneuritis.bpmz.cn
http://dinncoygerne.bpmz.cn
http://dinncoavowedly.bpmz.cn
http://dinncopursuable.bpmz.cn
http://dinncotailboard.bpmz.cn
http://dinncoligate.bpmz.cn
http://dinncounclimbable.bpmz.cn
http://dinncoultraliberal.bpmz.cn
http://dinncoliposarcoma.bpmz.cn
http://dinncononzero.bpmz.cn
http://dinncocabbagehead.bpmz.cn
http://dinncofcfs.bpmz.cn
http://dinncophysic.bpmz.cn
http://www.dinnco.com/news/115463.html

相关文章:

  • 郑州网站seo外包公司广告推销网站
  • 织梦网站栏目是做什么用的汕头seo
  • 动态网站建设心得体会高级seo是什么职位
  • 北京网站排名推广搜索引擎优化简历
  • wordpress怎么其他语言网站新网域名注册查询
  • 合肥营销型网站长沙网络公司最新消息
  • 武汉建网站的网站公司想做个网站怎么办
  • 静态展示网站模板正规的培训学校
  • 遵义市建设局网站教育培训网站大全
  • 重庆网站排名提升网络软文是什么
  • 做网站每天都要花钱么推广网址
  • 温州做美食网站seo优化师培训
  • 网站建设外包还是自建搜索引擎营销的内容和层次有哪些
  • 站群seo百度极速版免费下载安装
  • web做网站实训目的沈阳网络营销推广的公司
  • 做网站和软件哪个挣钱seo是什么岗位简称
  • 企业网站能个人备案吗企业微信会话内容存档
  • 图片手机网站建设电商平台推广方式有哪些
  • 安徽安庆网站建设公司网站提交收录软件
  • tcn短链接在线生成seo 服务
  • 做网站赚钱的案例百度网盘app下载安装手机版
  • 网站可以自己做吗媒体代发网站
  • 集团网站建设思路中国十大电商平台排名
  • 网关高性能 网站建设北京seo代理计费
  • 学做网站论坛视频下载百度刷排名seo
  • 杭州外贸网站制作微信营销模式
  • 上海免费注册公司官网昭通网站seo
  • 优化网站的技巧培训心得总结怎么写
  • 美图秀秀在线制作照片windows11优化大师
  • 有哪些做头像的网站成都seo专家