速战速决 go - go 面向对象: 函数(函数基础,带变量名的返回值,多返回值,可变参数,传参时指针和非指针的区别)

速战速决 go https://github.com/webabcd/GoSample
作者 webabcd

速战速决 go - go 面向对象: 函数(函数基础,带变量名的返回值,多返回值,可变参数,传参时指针和非指针的区别)

示例如下:

oop/function1.go

// go 面向对象 - 函数(函数基础,带变量名的返回值,多返回值,可变参数,传参时指针和非指针的区别)

package oop

import "fmt"

func Function1Sample() {
	function1_sample1()
	function1_sample2()
	function1_sample3()
}

func function1_sample1() {
	// 调用函数
	a := func11(0, "a", "b")
	fmt.Println(a) // 0ab

	// 调用函数
	b := func12()
	fmt.Println(b) // 100

	// 调用函数(此函数有多个返回值)
	c1, c2, c3 := func13()
	fmt.Println(c1, c2, c3) // 0 a true
}

// 定义一个函数
// 参数 a 是 int 类型,参数 b 和 c 是 string 类型,返回值是 string 类型
func func11(a int, b, c string) string {
	return fmt.Sprint(a, b, c)
}

// 为函数定义一个带有变量名的返回值
func func12() (x int) {
	// 变量会用默认值初始化
	fmt.Println(x) // 0
	x = 100

	// 直接 return 返回的就是你上面定义的返回值的变量名
	return
	// 也可以 return 指定数据的
	// return x
}

// 函数支持多返回值
func func13() (int, string, bool) {
	return 0, "a", true
}

func function1_sample2() {
	// 调用带有可变参数的函数(可变参数为 int 类型的可变参数)
	func14("webabcd", 0, 1, 2)

	// 调用带有可变参数的函数(可变参数为任意类型的可变参数)
	func15(0, "a", true)
}

// 函数支持可变参数,可变参数要放到其他参数的后面
// 下面的函数定义了一个 int 类型的可变参数
func func14(a string, args ...int) {
	fmt.Println(a)
	// 遍历可变参数
	for _, arg := range args {
		fmt.Println(arg)
	}
}

// 下面的函数定义了一个任意类型的可变参数
func func15(args ...interface{}) {
	// 将可变参数传给其他函数时要注意参数名后面要跟 ...
	func16(args...)
}

// 下面的函数定义了一个任意类型的可变参数
func func16(args ...interface{}) {
	// 遍历可变参数
	for _, arg := range args {
		// 获取当前遍历出的参数的数据类型
		switch arg.(type) { // 这个是接口的类型断言
		case int:
			fmt.Println(arg, "int")
		case string:
			fmt.Println(arg, "string")
		case bool:
			fmt.Println(arg, "bool")
		}
	}
}

// 本例由于演示传参时指针和非指针的区别
func function1_sample3() {
	a, b := 0, 0
	c := &b
	fmt.Printf("%d, %d, %p, %p, %p\n", a, b, &a, &b, &c) // 0, 0, 0xc0000140c0, 0xc0000140c8, 0xc000006030
	func17(a, &b)
	fmt.Printf("%d, %d, %p, %p, %p\n", a, b, &a, &b, &c) // 0, 1, 0xc0000140c0, 0xc0000140c8, 0xc000006030
}

// 无论实参是非指针还是指针,形参都会复制实参,然后在函数中使用
// 实参是非指针,则形参会复制实参,然后在函数中使用,所以函数中对形参的操作不会影响到实参
// 实参是指针,则形参会复制实参(也就是说形参指向的值和实参指向的值是同一个),然后在函数中使用,所以函数中对形参指向的值做操作就是对实参指向的值做操作
func func17(a int, b *int) {
	// 注意:这里实参 b 和形参 b 本身保存的值(这个保存的值是一个指针)是相同的,但是实参 b 的指针和形参 b 的指针是不同的(也就是说不管是不是指针,形参都会将实参复制出一份并使用)
	fmt.Printf("%d, %d, %p, %p, %p\n", a, *b, &a, b, &b) // 0, 0, 0xc0000140d0, 0xc0000140c8, 0xc000006038
	a = 1
	*b = 1
	fmt.Printf("%d, %d, %p, %p, %p\n", a, *b, &a, b, &b) // 1, 1, 0xc0000140d0, 0xc0000140c8, 0xc000006038
}

速战速决 go https://github.com/webabcd/GoSample
作者 webabcd

posted @ 2022-02-08 14:23  webabcd  阅读(101)  评论(0编辑  收藏  举报