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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

golang内置数据类型作为函数参数

發布時間:2025/3/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang内置数据类型作为函数参数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 先上結論

  golang的所有內置類型作為函數參數傳遞都是傳值的方式(沒有傳遞引用一說),需要注意的是:數組、slice和map作為函數參數時也是傳值,但是如果對結構內元素進行的修改,修改的是原數據。如果是對其進行整體賦值,則不會修改原數據,相當于拷貝出一個新的臨時變量。要想無論什么情況都修改原數據,可以通過傳遞指針參數實現。

  • 來段實例代碼
1 package main 2 3 import ( 4 "bytes" 5 "fmt" 6 "strings" 7 ) 8 9 func f_1(a int) { 10 a = 2 11 } 12 13 func f_1_1(a *int) { 14 *a = 2 15 } 16 17 func f_2(s string) { 18 s = "cba" 19 } 20 21 func f_2_1(s *string) { 22 *s = "cba" 23 } 24 25 func f_3(v []string) { 26 v[0] = "haha" 27 } 28 29 func f_3_1(v []string) { 30 v = nil 31 } 32 33 func f_3_2(v *[]string) { 34 *v = nil 35 } 36 37 func f_4(m map[int]int) { 38 m[1] = 3 39 m[3] = 1 40 } 41 42 func f_4_1(m map[int]int) { 43 m = nil 44 } 45 46 func f_4_2(m *map[int]int) { 47 *m = nil 48 } 49 50 func f_5(b []byte) { 51 b[0] = 0x40 52 } 53 54 func f_5_1(b []byte) { 55 b = bytes.Replace(b, []byte("1"), []byte("a"), -1) 56 } 57 58 func f_5_2(b *[]byte) { 59 *b = bytes.Replace(*b, []byte("1"), []byte("a"), -1) 60 } 61 62 type why struct { 63 s []string 64 } 65 66 func (ss why) SetV(s []string) { 67 ss.s = s 68 } 69 70 func (ss *why) SetP(s []string) { 71 ss.s = s 72 } 73 74 func (ss why) String() string { 75 return strings.Join(ss.s, ",") 76 } 77 78 func main() { 79 a := 1 80 s := "abc" 81 v := []string{"sd", "aa"} 82 m := map[int]int{1: 1, 2: 2, 3: 3} 83 f_1(a) 84 f_2(s) 85 f_3(v) 86 f_4(m) 87 fmt.Printf("%d,%s,%v,%v\n", a, s, v, m) 88 f_3_1(v) 89 f_4_1(m) 90 fmt.Printf("%d,%s,%v,%v\n", a, s, v, m) 91 f_1_1(&a) 92 f_2_1(&s) 93 f_3_2(&v) 94 f_4_2(&m) 95 fmt.Printf("%d,%s,%v,%v\n", a, s, v, m) 96 b := []byte("12145178") 97 f_5(b) 98 fmt.Printf("%s\n", b) 99 f_5_1(b) 100 fmt.Printf("%s\n", b) 101 f_5_2(&b) 102 fmt.Printf("%s\n", b) 103 ss := &why{} 104 ss.SetV([]string{"abc", "efg"}) 105 fmt.Println(ss) 106 ss.SetP([]string{"abc", "efg"}) 107 fmt.Println(ss) 108 }

輸出如下

1 1,abc,[haha aa],map[1:3 2:2 3:1] slice和map值傳遞是可以修改原數據的,但基本數據類型不行 2 1,abc,[haha aa],map[1:3 2:2 3:1] 整體賦值不會修改原數據,值得注意的是map是無序的 3 2,cba,[],map[] 傳遞指針始終會修改原數據 4 @2145178 同上 5 @2145178 使用bytes.Replace實際上還是賦值,所以不會修改原數據 6 @2a45a78 使用指針傳參就可以了 7 類的成員函數定義為傳值的方式,不會修改原數據(原數據為空) 8 abc,efg 類的成員函數定義為傳指針的方式,可以修改原成員變量 9 10 成功: 進程退出代碼 0.

現在弄明白了嗎~

轉載于:https://www.cnblogs.com/borey/p/5622820.html

總結

以上是生活随笔為你收集整理的golang内置数据类型作为函数参数的全部內容,希望文章能夠幫你解決所遇到的問題。

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