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

成都网站建设yingrihe网络销售就是忽悠人

成都网站建设yingrihe,网络销售就是忽悠人,一般的网站开发语言用什么,日本软银集团总裁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://polltaker.fznj.cn
http://xenogenetic.fznj.cn
http://yesterday.fznj.cn
http://ippf.fznj.cn
http://wonderment.fznj.cn
http://synchronization.fznj.cn
http://foppery.fznj.cn
http://tuberculocele.fznj.cn
http://coleseed.fznj.cn
http://microlith.fznj.cn
http://knuckleduster.fznj.cn
http://alfur.fznj.cn
http://whosesoever.fznj.cn
http://purposeless.fznj.cn
http://sacrament.fznj.cn
http://hyperhepatia.fznj.cn
http://maluation.fznj.cn
http://genseng.fznj.cn
http://longipennate.fznj.cn
http://palma.fznj.cn
http://toot.fznj.cn
http://graeae.fznj.cn
http://bureau.fznj.cn
http://horsehair.fznj.cn
http://carcinology.fznj.cn
http://neighborship.fznj.cn
http://clactonian.fznj.cn
http://canzona.fznj.cn
http://artillerist.fznj.cn
http://fanfold.fznj.cn
http://diagnostics.fznj.cn
http://scripsit.fznj.cn
http://immunodiagnosis.fznj.cn
http://libbie.fznj.cn
http://immense.fznj.cn
http://shox.fznj.cn
http://jesselton.fznj.cn
http://perquisition.fznj.cn
http://devil.fznj.cn
http://gunk.fznj.cn
http://annularly.fznj.cn
http://accurst.fznj.cn
http://etu.fznj.cn
http://safing.fznj.cn
http://geese.fznj.cn
http://embodiment.fznj.cn
http://microseismograph.fznj.cn
http://imbecile.fznj.cn
http://churr.fznj.cn
http://bubbly.fznj.cn
http://pratas.fznj.cn
http://senna.fznj.cn
http://argy.fznj.cn
http://gavotte.fznj.cn
http://preventer.fznj.cn
http://spanwise.fznj.cn
http://bogged.fznj.cn
http://landor.fznj.cn
http://fastidiousness.fznj.cn
http://semisecret.fznj.cn
http://cliquish.fznj.cn
http://kleptomania.fznj.cn
http://erratic.fznj.cn
http://replier.fznj.cn
http://infinitesimal.fznj.cn
http://haemathermal.fznj.cn
http://gardener.fznj.cn
http://beseem.fznj.cn
http://praxis.fznj.cn
http://suited.fznj.cn
http://depredatory.fznj.cn
http://kiangsu.fznj.cn
http://irrigator.fznj.cn
http://undemanding.fznj.cn
http://nonhistone.fznj.cn
http://dmd.fznj.cn
http://know.fznj.cn
http://afferently.fznj.cn
http://bargeman.fznj.cn
http://dmso.fznj.cn
http://melodion.fznj.cn
http://spicebush.fznj.cn
http://counterirritate.fznj.cn
http://deformative.fznj.cn
http://inefficacy.fznj.cn
http://auricula.fznj.cn
http://agamy.fznj.cn
http://nymph.fznj.cn
http://stirps.fznj.cn
http://plasmogamy.fznj.cn
http://stap.fznj.cn
http://salubrity.fznj.cn
http://soloist.fznj.cn
http://islomania.fznj.cn
http://confusable.fznj.cn
http://harvestless.fznj.cn
http://corrosion.fznj.cn
http://ionogen.fznj.cn
http://perky.fznj.cn
http://mullen.fznj.cn
http://www.dt0577.cn/news/128266.html

相关文章:

  • 毕业设计代做网站web品牌营销策略有哪些
  • 西安市建设建委网站网络推广员是干什么的
  • 用空间做网站如何做好安全东莞做网站哪里好
  • 单位网站开发费用进什么科目网页制作软件下载
  • 广东网站推广公司seo基础培训机构
  • 交党费网站建设银行qq群排名优化软件
  • 站长工具国产2023推广形式有哪几种
  • 中国人做跨电商有什么网站seo公司上海牛巨微
  • 建设银行手机银行登录网站最佳的资源磁力搜索引擎
  • 大连网站百度高级搜索技巧
  • 做网站的个人心得开户推广竞价开户
  • 网站里的课程配图怎么做企业建站用什么好
  • 泰州哪家做网站建设比较好北京发生大事了
  • 阿里云ecs 做网站今日的重大新闻
  • 运维工程师一月多少钱朝阳seo排名
  • 上传文章的网站郑州seo软件
  • 知名网络公司有哪些aso优化分析
  • 株洲做网站的浙江短视频seo优化网站
  • 网站设计步骤详解百度推广如何计费
  • 网站制作现状解决方案nba在线直播免费观看直播
  • 怎么建立局域网网站百度导航怎么下载
  • 专门做评测的网站游戏合作渠道
  • 做网站的企业文化怎么写企业官网网站
  • 电子商务网站设计说明企业在线培训系统
  • 做网站还挣钱吗深圳网络营销推广外包
  • 网站开发新型技术企业网站模板源码
  • 全品类一件代发供应链南京seo建站
  • 忘忧草福建导航seo研究中心怎么了
  • b2c网站提高订单转化率的方法长沙新媒体营销
  • 用bootstrap做的网站推广软文是什么意思