golang的基本类型分类

***golang中的基本类型分为值类型和引用类型***参考Go中的值类型和引用类型

函数传参的两种方式

1.值传递
2.引用传递

注:

  1. golang函数传参都是以复制变量的方式,不支持引用的方式
  2. 特殊的是:go语言闭包函数对外部变量是以引用的方式使用 参考由"go语言闭包函数对外部变量是以引用的方式使用"引发的闭包探讨

golang传递基本类型的不同

  1. golang传递值类型是指复制了一份值之后传递,改变形参并不能改变原有实参的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
    "fmt"
)

func main() {
    a := 888
    changeint(a)
    fmt.Println(a) //888
}
func changeint(int1 int) {
    int1 = 999
}
  1. golang传递引用类型是传递地址,改变形参会改变原有实参的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import (
    "fmt"
)

func main() {
    a := make(map[int]int)
    a[1] = 888
    fmt.Println(a) //map[1:888]
    changemap(a)
    fmt.Println(a) //map[1:999]
}

func changemap(map1 map[int]int) {
    map1[1] = 999
}
  1. golang引用类型传递之后整体赋值,并不能改变原有实参的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
    "fmt"
)

func main() {
    a := make(map[int]int)
    a[1] = 888
    fmt.Println(a) //map[1:888]
    changemap(a)
    fmt.Println(a) //map[1:888]
}

func changemap(map1 map[int]int) {
    map2 := make(map[int]int)
    map2[1] = 999
    map1 = map2
}

注:引用进行第二次赋值的时候,实际上把这份引用指向了另外一个变量,所以之后对这个变量的操作不会影响到外部的对象。

  1. golang任何类型的全局变量都能被形参改变
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
    "fmt"
)

var map1 = make(map[int]int)

func main() {
    map1[1] = 888
    map2 := make(map[int]int)
    map2[1] = 999
    changemap(map2)
    fmt.Println(map1) //map[1:999]
}

func changemap(map2 map[int]int) {

    map1 = map2
}
  1. golang传递值类型想要改变实参,需要传递值类型的指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
    "fmt"
)

func main() {
    a := 888
    changeint(&a)
    fmt.Println(a) //999

}
func changeint(int1 *int) {
    *int1 = 999

6.golang传递值类型时通常传递指针(在对象较大时能够提升性能,减少内存使用),同时传递类型要做到统一