日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于golang的append函数的踩坑

發布時間:2023/11/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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函数的踩坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。