关于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失效的原因待查
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不存在引用賦值
測試代碼
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函数的踩坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 445. 两数相加 II golang
- 下一篇: 英雄联盟莫甘娜的E对引燃和虚弱有没有效果