php 不确定参数个数,PHP->GO 基础-函数

//go语言以包作为管理单位

//每个文件必须先声明包

//程序必须有一个main(包)重要

package main

import "fmt"

//入口函数

func main() { //左括号必须和函数名同行

//调用函数,大部分都需要导入包

//go语言语句结束没有分号

fmt.Println("hello word")

}

无参无返回值函数

package main

import "fmt"

//无参无返回值函数的定义

func MyFunc(){

a := 666

fmt.Println("a = ",a)

}

func main() {

MyFunc() //调用函数

}

有参无返回值函数

package main

`

import "fmt"

//有参无返回值函数的定义

//MyFunc2(a int, b string ,c bool) //多个参数

//MyFunc2(a,b,c,d int ) //多个同一类型的参数

//MyFunc2(a,b, int ,c string) //不建议使用此方式定义多个参数

func MyFunc(a int){

fmt.Println("a = ",a)

}

func main() {

MyFunc(666) //调用函数

}

不定参数类型的函数

package main

import "fmt"

//...int 这样的的类型 ...type 不定参数类型

//注意:不定参数,一定只能放在形参的最后一个参数

//func MyFunc(a int,arge ...int) { 传递参数可以是1个或者多个

func MyFunc(arge ...int) { //传递参数可以是0个或者多个

for i := 0; i < len(arge); i++ {

fmt.Println("value = ", arge[i])

}

for i, data := range arge {

fmt.Println("value = ", i, data)

}

}

func main() {

MyFunc(1, 2, 23) //调用函数

}

只有一个返回值函数

package main

import "fmt"

//无参 有一个返回值

//有返回值得函数需要通过return 中断函数,通过return 返回

func MyFunc01() int {

return 666

}

//给返回值起一个变量名。go推荐写法

func MyFunc02() (result int) {

return 666

}

func MyFunc03() (result int) {

result = 666

return result

}

func main() {

var a int

//调用函数

a = MyFunc01()

fmt.Println("a =", a)

b := MyFunc02()

fmt.Println("b =", b)

c := MyFunc03()

fmt.Println("c =", c)

}

有多个返回值函数

package main

import "fmt"

//多个返回值

func MyFunc01() (int, int, int) {

return 666, 222, 777

}

//官方推荐写法

//func MyFunc02() (a,b,c int){

func MyFunc02() (a int, b int, c int) {

a, b, c = 1, 2, 3

return

}

func main() {

a, b, c := MyFunc01()

fmt.Printf("a= %d,b=%d,c=%d\n", a, b, c)

}

函数的使用案例

package main

import "fmt"

//定义函数

func MaxAndMin(a, b int) (max, min int) {

if a > b {

max = a

min = b

} else {

max = b

min = a

}

return //有返回值的函数,必须通过 return 返回

}

func main() {

max, min := MaxAndMin(25, 36)

fmt.Printf("max = %d,min = %d", max, min)

a, _ := MaxAndMin(36, 99) //只取一个值

fmt.Printf("max = %d", a)

}

函数类型

package main

import "fmt"

//定义函数

func Test(a, b int) (sum int) {

sum = a + b

return

}

//函数也是一种数据了下,通过type给函数类型起名

//FuncType 它是一个函数类型

type FuncType func(int, int) int //没有函数名字,没有{}

func main() {

//传统调用方式

sum := Test(10, 20)

fmt.Println("result = ", sum)

// 声明一个函数类型的变量,变量名叫fTest

var fTest FuncType

fTest = Test

sum = fTest(30, 40) //等价于 Test(10,20)

fmt.Println("result = ", sum)

}

回调函数

package main

import "fmt"

func Add(a, b int) (result int) {

result = a + b

return

}

func Sub(a, b int) (result int) {

result = a - b

return

}

//回调函数,函数有一个参数是函数类型,这个函数就是回调函数

//计算器,可以进行四则运算

//多态,多种形态,调用同一个接口,可以实现不同的表现

//定义函数

func Calc(a, b int, Ftest FuncType) (result int) {

result = Ftest(a, b)

return

}

//函数也是一种数据了下,通过type给函数类型起名

//FuncType 它是一个函数类型

type FuncType func(int, int) int //没有函数名字,没有{}

func main() {

//传统调用方式

result := Calc(10, 20, Add)

fmt.Println("result = ", result)

result = Calc(10, 20, Sub)

fmt.Println("result = ", result)

}

闭包捕获外部变量特点

package main

import "fmt"

func main() {

a := 10

str := "mian"

func() {

//闭包以引用方式捕获外部变量

a = 666

str = "go"

fmt.Printf("a = %d ,str = %s\n", a, str)

}() //最后的() 代表直接调用

fmt.Printf("a = %d ,str = %s", a, str) //a = 666 ,str = go

}

闭包的特点

package main

import "fmt"

//函数的返回值是一个匿名函数,返回一个函数类型

func test02() func() int {

var x int

return func() int {

x++

return x * x

}

}

func main() {

//返回值为一个匿名函数,返回一个函数类型,通过f来调用闭包函数

//他不关心这些捕获了的变量和常量是否已经超出了作用域

//所以只有闭包还在使用它,这些变量就还会存在

f := test02()

fmt.Println(f())

fmt.Println(f())

fmt.Println(f())

fmt.Println(f())

fmt.Println(f())

}

defer的使用

package main

import "fmt"

func main() {

//defer 延迟调用,main 函数结束前调用

// 有多个defer 语句 他们会以 LIFO (现进后出)的顺序执行,哪怕函数或某个领域出现错误,这些调用依旧会被执行

defer fmt.Println("bbbb") //最后输出

fmt.Println("aaaaa")

}

defer同匿名函数的使用

package main

import "fmt"

func main() {

a := 10

b := 20

defer func(a, b int) {

fmt.Printf("a = %d,b = %d\n", a, b) //后执行 输出111,222

}(a, b) //传参时 defer 是先传当前参数(a = 10,b=20),最后执行 所以输出 a = 10 b =20

a = 111

b = 222

fmt.Printf("a = %d,b = %d\n", a, b) //先执行 输出111,222

}

func main01() {

a := 10

b := 20

defer func() {

fmt.Printf("a = %d,b = %d\n", a, b) //后执行 输出111,222

}()

a = 111

b = 222

fmt.Printf("a = %d,b = %d\n", a, b) //先执行 输出111,222

}

本作品采用《CC 协议》,转载必须注明作者和本文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值