文章目录

  • 从LeetCode第26题产生的疑问
    • 测试代码
  • LeetCode22
  • 解决方式
    • 原题
    • 例2 LeetCode189
  • copy的值复制

从LeetCode第26题产生的疑问

这篇文章里面提到了关于在函数内部修改数据的情况。但是LeetCode22题中发现append无法在传送变量中进行append。

测试代码

输出结果
[123 456 7] //使用test函数append数字8,但是并没有修改原数据的值
[1 2 3] //同理,只可以在main函数append成功
[1 2 4] //但是可以修改数据的值,append失效的原因待查

package mainimport "fmt"func main() {nums := []string{}nums = append(nums, "123")nums = append(nums, "456")nums = append(nums, "7")test(nums)fmt.Println(nums)num := []int{}num = append(num, 1)num = append(num, 2)num = append(num, 3)fmt.Println(num)test1(num)fmt.Println(num)
}func test1(num []int) {// append无法更改值。num = append(num, 4)num[2] = 4
}func test(nums []string) {nums = append(nums, "8")
}

LeetCode22

在做这个题其中nums = append(nums, s),将所有符合条件的结果存储在nums中,但是return之后nums为空,发现nums无法修改数据的值

package mainimport "fmt"func generateParenthesis(n int) []string {nums := make([]string, 0)generate("",nums, n, n)return nums
}func generate(s string, nums []string, left int,right int ) {if left == 0 && right == 0 {nums = append(nums, s)return}if left > 0 {generate(s + "(", nums, left - 1, right)}if right > left {generate(s + ")", nums, left, right - 1)}
}func main(){x := generateParenthesis(2)fmt.Println(x)
}

解决方式

func main() {nums := []string{}nums = append(nums, "123")nums = append(nums, "456")nums = append(nums, "7")test(&nums)fmt.Println(nums)
}func test(nums *[]string) {*nums = append(*nums, "8")
}

原题

https://blog.csdn.net/csdn_kou/article/details/104307631
为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

例2 LeetCode189

https://leetcode-cn.com/problems/rotate-array
append 拼接过程中重新创建了底层数组,导致函数中的 nums 不再是函数外的 nums,引用失效。
其实也证明go中没有引用类型,因为go不存在引用赋值
测试代码

package mainimport "fmt"func rotate(nums []int, k int)  {tx := &numste := reverse(&nums,k)*tx = tefmt.Println("2", nums)
}func reverse(nums *[]int, k int) []int{*nums = append(*nums, 8)return *nums
}func main(){nums := []int{1,2,3,4,5,6,7}rotate(nums, 3)fmt.Println("1", nums)
}

189题使用这样的方式改变了数组的值

func rotate(nums []int, k int)  {k %= len(nums)ans := append(nums[len(nums)-k:], nums[:len(nums)-k]...)nums = append(nums[:0], ans...)
}

测试是否可以改变原数组。这个小细节可以记一下

package mainimport "fmt"func t(nums []int) {// 1 Right//ans := append(nums[:2], nums[1])//nums = append(nums[:0], ans...)// 2 Right//ans := append(nums[:2], 1)//nums = append(nums[:0], ans...)// 3 False//ans := append(nums, 1)//nums = append(nums[:0], ans...)// 4 Right//ans := append(nums[:len(nums)-1], 1)//nums = append(nums[:0], ans...)// 5 Right//ans := append(nums[:1], 1)//nums = append(nums[:0], ans...)// 6 Falseans := append(nums[:0], 1)nums = append(nums[:0], ans...)
}func main() {nums := []int {1,2,3}t(nums)fmt.Println(nums)
}

copy的值复制

package mainimport "fmt"func test() {temp := [][]int {{1,2,3},{2,3}}nums := []int {999}fmt.Println("temp_init", temp)temp = append(temp, nums)fmt.Println("temp_append_nums", temp)nums[0] = 11111//temp [[1 2 3] [2 3]]//temp [[1 2 3] [2 3] [999]]//temp [[1 2 3] [2 3] [11111]]//可以看到append不是值拷贝,如果只想值拷贝使用copy函数fmt.Println("temp_change_nums_print_temp", temp)fmt.Println(nums)
}
func main() {temp := [][]int {{1,2,3},{2,3}}nums := []int {999}fmt.Println("temp_init", temp)r := make([]int, len(nums))copy(r, nums)temp = append(temp, r)fmt.Println("temp_append_nums", temp)nums[0] = 11111fmt.Println("temp_change_nums_print_temp", temp)fmt.Println(nums)
}

关于golang的append函数的踩坑相关推荐

  1. golang slice append函数如何头插

    题目 二叉树的锯齿形层次遍历 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,n ...

  2. Golang 原子操作的应用及踩坑

    背景 gener_url常驻内存获取配置优化 常驻内存的相关请见博文 Golang 常驻内存学习并使用 优化原因 由于需要将3个redis-key改为常驻内存,一开始我是逐个key获取并判断err,有 ...

  3. golang base64 StdEncoding和URLEncoding 踩坑

    今天想着玩一玩腾讯的通用OCR(Optical Character Recognition,光学字符识别,就是文字识别了),官网只有php和py示例,翻译了半天,头疼 整了一下午,最后发现是栽在了ba ...

  4. Golang交叉编译Sqlite3踩坑记录

    Golang交叉编译Sqlite3踩坑记录 ,windows下编译golang go-sqlite3解决方案 众所周知Golang能够在一个平台编译不同平台可执行程序进行发布 然而在遇到需要内置处理程 ...

  5. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

    目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...

  6. golang中创建logger时候踩过的坑

    golang中创建logger时候踩过的坑 错误的代码 package mainimport ("fmt""io""log""os ...

  7. mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题

    问题复盘 本次复盘会用一个很简单的订单表作为示例. 数据准备 订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( ...

  8. Intrinsics函数Tips与踩坑

    Intrinsics函数踩坑,感觉用Intrinsics函数,最重要的是不能想当然,只有想不到..还是得参考官方文档来 一系列乘法MUL--_mm256_mul_epi32 这个乘法会把32位的两个整 ...

  9. Spark踩坑填坑-聚合函数-序列化异常

    Spark踩坑填坑-聚合函数-序列化异常 一.Spark聚合函数特殊场景 二.spark sql group by 三.Spark Caused by: java.io.NotSerializable ...

最新文章

  1. php的环境怎么配置文件,php环境下所有的配置文件以及作用
  2. [禅悟人生]越忙的人时间越多
  3. HTTP 错误 404.15 - Not Found请求筛选模块被配置为拒绝包含的查询字符串过长的请求...
  4. centos 上传jar 命令_centos上快速将一个jar使用docker部署启动
  5. SQL:数据表给定字段的多行记录的合并
  6. notejs环境搭建
  7. 正则表达式的一些符号基础和实例解析
  8. 问题十三:怎么用ray tracing画个球
  9. PHP list() 函数
  10. 篇章级关系抽取(Doc-RE)论文列表整理
  11. C++ STL中vector的内存机制和性能分析
  12. 什么是webpack? ----(webpack入门)
  13. 软件项目管理案例教程期末考试知识点复习(一)软件项目管理概述
  14. 二元函数可导与可微的关系_二元函数可导、可微与连续性的关系.pdf
  15. vue面试题+答案,2021前端面试
  16. JVM常见面试题及详解
  17. 谷歌浏览器翻译插件推荐——Google Chrome 插件推荐
  18. 在顺丰的历史上,扩大规模的资金来源
  19. Xtrabackup使用指南 InnoDB数据备份工具
  20. 【列表的使用】用python完成购物打印商品列表

热门文章

  1. python: 爬取[博海拾贝]图片脚本
  2. ASP.NET获取客户端、服务器端基础信息
  3. mysql基本命令入门
  4. STM32上使用JSON
  5. 雅虎前端优化的35条军规
  6. Css Sprites 多张图片整合在一张图片上
  7. python ATM购物程序
  8. const 和readonly
  9. UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
  10. linux raw socket 例子,raw socket编程例子