生活随笔
收集整理的這篇文章主要介紹了
golang内置数据类型作为函数参数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
golang的所有內(nèi)置類(lèi)型作為函數(shù)參數(shù)傳遞都是傳值的方式(沒(méi)有傳遞引用一說(shuō)),需要注意的是:數(shù)組、slice和map作為函數(shù)參數(shù)時(shí)也是傳值,但是如果對(duì)結(jié)構(gòu)內(nèi)元素進(jìn)行的修改,修改的是原數(shù)據(jù)。如果是對(duì)其進(jìn)行整體賦值,則不會(huì)修改原數(shù)據(jù),相當(dāng)于拷貝出一個(gè)新的臨時(shí)變量。要想無(wú)論什么情況都修改原數(shù)據(jù),可以通過(guò)傳遞指針參數(shù)實(shí)現(xiàn)。
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值傳遞是可以修改原數(shù)據(jù)的,但基本數(shù)據(jù)類(lèi)型不行
2 1,abc,[haha aa],map[
1:
3 2:
2 3:
1] 整體賦值不會(huì)修改原數(shù)據(jù),值得注意的是map是無(wú)序的
3 2,cba,[],map[] 傳遞指針始終會(huì)修改原數(shù)據(jù)
4 @
2145178 同上
5 @
2145178 使用bytes.Replace實(shí)際上還是賦值,所以不會(huì)修改原數(shù)據(jù)
6 @2a45a78 使用指針傳參就可以了
7 類(lèi)的成員函數(shù)定義為傳值的方式,不會(huì)修改原數(shù)據(jù)(原數(shù)據(jù)為空)
8 abc,efg 類(lèi)的成員函數(shù)定義為傳指針的方式,可以修改原成員變量
9
10 成功: 進(jìn)程退出代碼
0.
現(xiàn)在弄明白了嗎~
轉(zhuǎn)載于:https://www.cnblogs.com/borey/p/5622820.html
總結(jié)
以上是生活随笔為你收集整理的golang内置数据类型作为函数参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。