golang的所有內建型別作為函式引數傳遞都是傳值的方式(沒有傳遞引用一說),需要注意的是:陣列、slice和map作為函式引數時也是傳值,但是如果對結構內元素進行的修改,修改的是原資料。如果是對其進行整體賦值,則不會修改原資料,相當於拷貝出乙個新的臨時變數。要想無論什麼情況都修改原資料,可以通過傳遞指標引數實現。
1package main23
import (4"
bytes"5
"fmt"6
"strings"7
)89 func f_1(a int
) 12
13 func f_1_1(a *int
) 16
17 func f_2(s string
) 20
21 func f_2_1(s *string
) 24
25 func f_3(v string
) 28
29 func f_3_1(v string
) 32
33 func f_3_2(v *string
) 36
37 func f_4(m map[int]int
) 41
42 func f_4_1(m map[int]int
) 45
46 func f_4_2(m *map[int]int
) 49
50 func f_5(b byte
) 53
54 func f_5_1(b byte
) 57
58 func f_5_2(b *byte
) 61
62 type why struct
6566 func (ss why) setv(s string
) 69
70 func (ss *why) setp(s string
) 73
74 func (ss why) string() string
7778
func main()
82 m := map[int]int
83f_1(a)
84f_2(s)
85f_3(v)
86f_4(m)
87 fmt.printf("
%d,%s,%v,%v\n
", a, s, v, m)
88f_3_1(v)
89f_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")
97f_5(b)
98 fmt.printf("
%s\n
", b)
99f_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)
105fmt.println(ss)
106 ss.setp(string)
107fmt.println(ss)
108 }
輸出如下
11,abc,[haha aa],map[1:3
2:23:1
] slice和map值傳遞是可以修改原資料的,但基本資料型別不行
21,abc,[haha aa],map[1:3
2:23:1
] 整體賦值不會修改原資料,值得注意的是map是無序的32
,cba,,map 傳遞指標始終會修改原資料
4 @2145178
同上5 @2145178
使用bytes.replace實際上還是賦值,所以不會修改原資料
6@2a45a78 使用指標傳參就可以了
7類的成員函式定義為傳值的方式,不會修改原資料(原資料為空)
8abc,efg 類的成員函式定義為傳指標的方式,可以修改原成員變數
910 成功: 程序退出** 0.
現在弄明白了嗎~
Golang 資料型別
注釋 行注釋 塊注釋 識別符號 除了數字開頭的不允許,符號開頭的不允許,關鍵字不允許,其他的unicode字元組合都可以。33 也可以是識別符號,我們 也可以是識別符號。識別符號也區分大小寫。以大寫字母開頭的識別符號是公開的。其他任何識別符號都是私有的。空識別符號 是乙個佔位符,用於賦值操作的時候,...
Golang資料型別
二 布林型 三 字串 數字 字串和布林型。布林型的值只可以是常量 true 或者 false。數字型別支援整型和浮點型,並且支援複數,其中位的運算採用補碼。復合資料型別包括 陣列 結構體是通過組合簡單型別,來表達更加複雜的資料結構。引用型別包括 指標 slice map channel 介面和函式型...
內建資料型別
內建 顧名思義,指內部設定,如內建型別 內建api 內建類 內建方法 等 內建資料型別 顧名思義,指內部設定的資料型別,就是某種語言內部自己定義的一些東西的型別,如 基本資料型別 引用型別 變數型別 等 性質 1 內部設定,內部定義 2 型別,分類 外接型別 與內建型別相反的是外接型別,指內外設定的...