关于golang的append函数的踩坑
文章目录
- 从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函数的踩坑相关推荐
- golang slice append函数如何头插
题目 二叉树的锯齿形层次遍历 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,n ...
- Golang 原子操作的应用及踩坑
背景 gener_url常驻内存获取配置优化 常驻内存的相关请见博文 Golang 常驻内存学习并使用 优化原因 由于需要将3个redis-key改为常驻内存,一开始我是逐个key获取并判断err,有 ...
- golang base64 StdEncoding和URLEncoding 踩坑
今天想着玩一玩腾讯的通用OCR(Optical Character Recognition,光学字符识别,就是文字识别了),官网只有php和py示例,翻译了半天,头疼 整了一下午,最后发现是栽在了ba ...
- Golang交叉编译Sqlite3踩坑记录
Golang交叉编译Sqlite3踩坑记录 ,windows下编译golang go-sqlite3解决方案 众所周知Golang能够在一个平台编译不同平台可执行程序进行发布 然而在遇到需要内置处理程 ...
- 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)
目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...
- golang中创建logger时候踩过的坑
golang中创建logger时候踩过的坑 错误的代码 package mainimport ("fmt""io""log""os ...
- mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题
问题复盘 本次复盘会用一个很简单的订单表作为示例. 数据准备 订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( ...
- Intrinsics函数Tips与踩坑
Intrinsics函数踩坑,感觉用Intrinsics函数,最重要的是不能想当然,只有想不到..还是得参考官方文档来 一系列乘法MUL--_mm256_mul_epi32 这个乘法会把32位的两个整 ...
- Spark踩坑填坑-聚合函数-序列化异常
Spark踩坑填坑-聚合函数-序列化异常 一.Spark聚合函数特殊场景 二.spark sql group by 三.Spark Caused by: java.io.NotSerializable ...
最新文章
- php的环境怎么配置文件,php环境下所有的配置文件以及作用
- [禅悟人生]越忙的人时间越多
- HTTP 错误 404.15 - Not Found请求筛选模块被配置为拒绝包含的查询字符串过长的请求...
- centos 上传jar 命令_centos上快速将一个jar使用docker部署启动
- SQL:数据表给定字段的多行记录的合并
- notejs环境搭建
- 正则表达式的一些符号基础和实例解析
- 问题十三:怎么用ray tracing画个球
- PHP list() 函数
- 篇章级关系抽取(Doc-RE)论文列表整理
- C++ STL中vector的内存机制和性能分析
- 什么是webpack? ----(webpack入门)
- 软件项目管理案例教程期末考试知识点复习(一)软件项目管理概述
- 二元函数可导与可微的关系_二元函数可导、可微与连续性的关系.pdf
- vue面试题+答案,2021前端面试
- JVM常见面试题及详解
- 谷歌浏览器翻译插件推荐——Google Chrome 插件推荐
- 在顺丰的历史上,扩大规模的资金来源
- Xtrabackup使用指南 InnoDB数据备份工具
- 【列表的使用】用python完成购物打印商品列表