go八:函数的参数传递

int、string,及其指针作为参数:

package main

import "fmt"

func main() {
    a := 10
    fmt.Printf("1、执行函数前的变量a的内存地址:%p, 值为:%v\n", &a, a)  //0xc04204c080, 10
    //传值:不改变变量原来的值
    changeIntVal(a)
    fmt.Printf("2、changeIntVal函数调用后,变量a的内存地址:%p, 值为:%v\n", &a, a)  //0xc04204c080, 10
    //传引用:将改变变量原来的值
    changeIntPtr(&a)
    fmt.Printf("3、changeIntPtr函数调用后,变量a的内存地址:%p, 值为:%v\n", &a, a)  //0xc04204c080, 200

}
func changeIntVal(a int) {
    fmt.Printf("changeIntVal函数内:值参数a的内存地址:%p,值:%v\n", &a, a )  //0xc04204c0a0,10
    a = 90
}
func changeIntPtr(a *int) {
    fmt.Printf("changeIntPtr函数内:指针参数a的内存地址:%p,值:%v\n", &a, a )  //0xc04206c020,0xc04204c080
    *a = 200
}

数组、数组指针作为参数:

package main

import (
    "fmt"
)

func main() {
    a := [4]int{1, 2, 3, 4}
    fmt.Printf("1、执行函数前的变量a的内存地址:%p, 值为:%v\n", &a, a) //0xc04204c080, [1 2 3 4]
    //传值:不改变变量原来的值
    changeArrayVal(a)
    fmt.Printf("2、changeIntVal函数调用后,变量a的内存地址:%p, 值为:%v\n", &a, a) //0xc04204c080, [1 2 3 4]
    //传引用:将改变变量原来的值
    changeArrayPtr(&a)
    fmt.Printf("3、changeIntPtr函数调用后,变量a的内存地址:%p, 值为:%v\n", &a, a) //0xc04204c080, [1 33 3 4]

}
func changeArrayVal(a [4] int) {
    fmt.Printf("changeIntVal函数内:值参数a的内存地址:%p,值:%v\n", &a, a) //0xc04204c0a0,[1 2 3 4]
    a[0] = 99
}
func changeArrayPtr(a *[4]int) {
    fmt.Printf("changeIntPtr函数内:指针参数a的内存地址:%p,值:%v\n", &a, a) //0xc04206c020,&[1 2 3 4]
    (*a)[1] = 33
}

 

切片、切片指针作为参数:

package main

import (
    "fmt"
)

func main() {
    a := []int{1, 2, 3, 4}
    fmt.Printf("1、执行函数前的变量a的内存地址:%p, 值为:%v\n", &a, a) //0xc04204c080, [1 2 3 4]
    //传值:不改变变量原来的值
    changeArrayVal(a)
    fmt.Printf("2、changeIntVal函数调用后,变量a的内存地址:%p, 值为:%v\n", &a, a) //0xc04204c080, [99 2 3 4]
    //传引用:将改变变量原来的值
    changeArrayPtr(&a)
    fmt.Printf("3、changeIntPtr函数调用后,变量a的内存地址:%p, 值为:%v\n", &a, a) //0xc04204c080, [99 33 3 4]

}
func changeArrayVal(a [] int) {
    fmt.Printf("changeIntVal函数内:值参数a的内存地址:%p,值:%v\n", &a, a) //0xc04204c0a0,[99 2 3 4]
    a[0] = 99
}
func changeArrayPtr(a *[]int) {
    fmt.Printf("changeIntPtr函数内:指针参数a的内存地址:%p,值:%v\n", &a, a) //0xc04206c020,&[1 2 3 4]
    (*a)[1] = 33
}

struct、struct指针作为参数:

package main

import (
    "fmt"
)

type Teacher struct {
    name string
    age int
    married bool
    sex int8
}
func main() {
    a := Teacher{"bob", 25, false, 1}
    fmt.Printf("1、执行函数前的变量a的内存地址:%p, 值为:%v\n", &a, a) //0xc04204c080, {bob 25 false 1}
    //传值:不改变变量原来的值
    changeStructVal(a)
    fmt.Printf("2、changeIntVal函数调用后,变量a的内存地址:%p, 值为:%v\n", &a, a) //0xc04204c080, {bob 25 false 1}
    //传引用:将改变变量原来的值
    changeStruckPtr(&a)
    fmt.Printf("3、changeIntPtr函数调用后,变量a的内存地址:%p, 值为:%v\n", &a, a) //0xc04204c080,{ellen 50 false 1}

}
func changeStructVal(a Teacher) {
    fmt.Printf("changeIntVal函数内:值参数a的内存地址:%p,值:%v\n", &a, a) //0xc04204c0a0,{bob 25 false 1}
    a.age = 42
    a.name = "davied"
}
func changeStruckPtr(a *Teacher) {
    fmt.Printf("changeIntPtr函数内:指针参数a的内存地址:%p,值:%v\n", &a, a) //0xc04206c020,&{bob 25 false 1}
    a.age = 50
    a.name = "ellen"
}

 

package main
import (
"fmt"
)
type person struct {
id int
name string
score int
}
func test(s person) {
s.name = "张飞"
fmt.Println(s.id, s.name, s.score) //101 张飞 99
}
func main() {
//结构体,作为参数传递
stu := person{101, "宋江", 99}
test(stu)
fmt.Println(stu) //{101 宋江 99}
}


package main

import (
"fmt"
)

type person struct {
id int
name string
score int
}
func test(s []person) {
s[0].name = "张飞"
fmt.Println(s) //[{101 张飞 99} {102 宋江2 99} {103 宋江3 99}]
}
func main() {
//结构体切片,作为参数传递
s := []person{person{101, "宋江1", 99}, person{102, "宋江2", 99}}
//为切片添加元素
s = append(s, person{103, "宋江3", 99})
//切片,是指针传递,引用传递
test(s)
fmt.Println(s) //[{101 张飞 99} {102 宋江2 99} {103 宋江3 99}]

总结:

  • 所有指针作为参数,都属于指针引用,会改变原来的变量的值。
  • int、string作为参数时,属于传值,不会改变原来的变量的值。
  •  数组作为参数,也属于传值,不会改变原来的变量的值。
  • 切片作为参数,属于指针引用,会改变原来的变量的值

 

posted on 2018-03-29 18:56  myworldworld  阅读(160)  评论(0)    收藏  举报

导航