一、函数
1.概述
定义:完成某一功能的程序指令集合
分类:自定义函数,系统函数
基本语法:
func (形参列表)(返回值列表){ 执行语句 return返回值列表 }
2.包
包:go以包的形式管理文件和项目目录结构 包的作用:1.区分·相同名字的函数,变量等 2.管理文件项目 3.控制作用域
!!!不能把两个go文件保存到一个文件夹
!!!在 Go 语言中,:= 是一个短变量声明操作符(Short Variable Declaration Operator)。它用于在函数内部创建新的变量并同时赋值。
简单来说,使用 := 可以更简洁地声明和初始化变量,而不需要显式地指定变量的类型。Go 语言编译器会根据右侧表达式的类型来自动推断变量的类型。
下面是一个示例说明 := 的使用:
func main() {
// 使用短变量声明创建并初始化一个字符串变量
message := "Hello, World!"
` // 使用短变量声明创建并初始化一个整数变量 age := 30
// 打印变量的值
fmt.Println(message) // 输出: Hello, World!
fmt.Println(age) // 输出: 30
} ` 包的使用注意:1.从src下一级开始引用 2.文件包名一般小写,为package的名字
package utils
func Cal (a float64, b float64, c byte) float64 {
var res float64
switch c {
case '+':
res=a+b
case '-':
res=a-b
case '*':
res=a*b
case '/':
res=a/b
}
return res
}
3.支持给包重命名 4.如果要编译成可执行文件,则要将包声明为main,即package main
package main
import("fmt"
"demo/temperture"
)
func main() {
result :=utils.Cal(1.2,2.4,'/')
fmt.Println("result=",result)
}
3.函数的调用
package main
import("fmt"
)
func test(n1 int) {
n1=n1+1
fmt.Println("n1=",n1)
}
func main(){
n1 :=10
test(n1)
fmt.Println("n1=",n1)
}
go中函数也是一种数据类型,可以赋给变量,也可以作为形参使用 go语言支持自定义数据类型[type 自定义数据类型名称 数据类型]
(1)函数的递归
package main
import("fmt"
)
func test(n1 int) {
if n1>2{
n1--
test(n1)
}else{
fmt.Println("n1=",n1)
}
}
func main(){
test(6)
}
4.init函数
每个源文件都可以包含,在main函数执行前被调用
5.匿名函数
调用方式: 1.直接调用,只能用一次
package main
import("fmt"
)
func main(){
res:=func (n1,n2 float64)float64{
return n1+n2
}(10,20)
fmt.Println("",res)
}
2.将匿名函数赋给一个变量,实现多次调用
package main
import("fmt"
)
func main(){
res:=func (n1,n2 float64)float64{
return n1+n2
}
a:=res(20,10)
fmt.Println("",a)
}
全局匿名函数:将匿名函数赋给一个全局变量
package main
import("fmt"
)
var(res=func (n1,n2 float64)float64{
return n1+n2
} )
func main(){
a:=res(20,10)
fmt.Println("",a)
}
6.闭包
含义:一个函数和其相关的引用环境组合的一个整体
package main
import ("fmt")
func upper() func(int)int{
var n int=10
return func(x int)int {
n=n+x
return n
}
}
func main(){
f :=upper()
fmt.Println(f(8)) //18
fmt.Println(f(8)) //26
}
当我们反复调用f函数时,因为n是初始化一次,所以每调用一次就会累计
7.defer
(1)在函数内某一条执行语句前加上defer,可以使得函数执行到defer时,暂时不执行,将defer压入一个defer栈,等到函数执行完毕,再来执行defer(注意,是在此函数执行完后执行,而不是在所有程序后执行)
(2)defer栈的相关值也是独立的,不会因为前面的函数语句而改变
8.函数的参数传递
(1)分类 值传递 引用传递
9.字符串常用函数
(1)len(str) 统计字符串长度 (2)r:=[]rune(str) 字符串遍历 (3)n,err:=strconv.Atoi("str") 字符串转整数 (4)str=strconv.Itoa(12345)整数转自妇产 (5)var bytes=[]byte(“hello”) (6)str=string([]byte{12,13,13}) (7)str=strconv.FomatInt(123,2) (8)b:=strings.Contains("seafood","sea") (9)num:= strings.Count(“cheeese”,“e”) (10)b:=strings.Equalfold("abc","Abc")
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
a:=len("appple")
fmt.Println("",a)
b:=[]rune("appple")
fmt.Printf("%c",b[1])
fmt.Println()
n,err :=strconv.Atoi("hello")
if err !=nil{
fmt.Println("转换错误")
}else{
fmt.Println("n=",n)
}
str:=strconv.Itoa(12345)
fmt.Printf("%v,%T",str,str)
fmt.Println()
h := strings.Contains("seafood","seaF")
fmt.Printf("%v",h)
fmt.Println("abc"=="abs")
index:=strings.LastIndex("golang","go")
fmt.Printf("%v",index)
str3:=strings.Replace("gogogo","go","ya",2)
fmt.Printf("%v",str3)
str4:=strings.Split("gotofbedfdady","f")
fmt.Printf("%v",str4)
for st:=0;st<len(str4);st++{
fmt.Printf("str[%v]=%v\n",st,str4[st])
}
str5:="goLang"
str6:=strings.ToLower(str5)
str7:=strings.ToUpper(str5)
fmt.Printf("%v,%v",str6,str7)
str8:=strings.TrimSpace(" debuff ")
str9:=strings.Trim("idebuffi","i")
str10:=strings.TrimLeft("idebuffi","i")
str11:=strings.TrimRight("idebuffi","i")
fmt.Printf("%v,%v,%v,%v",str8,str9,str10,str11)
str12:=strings.HasPrefix("dadyiwantyou","dady")
str13:=strings.HasSuffix("dadyiwantyou","you")
fmt.Printf("%v,%v",str12,str13)
}
....
10.时间和日期相关的函数
package main
import (
"fmt"
"time"
)
func main(){
now:=time.Now()
fmt.Printf("now=%v,now type=%T",now,now)
fmt.Printf("年%v\n月%v\n日%v\n",now.Year(),now.Month(),now.Day())
fmt.Printf("时%v\n秒%v\n分%v\n",now.Hour(),now.Minute(),now.Second())
fmt.Print(now.Format("2006-09-02 15:08:05"))//使得现在时间按照这个格式输出
a:=time.Now().Unix()
time.Sleep(time.Second*10)
b:=time.Now().Unix()
fmt.Printf("break=%v",a-b)
num2:=new(int)
*num2=100
fmt.Printf("num2's type%T,num2=%v,num2地址%v,num2指向值%v",
num2,num2,&num2,*num2)
}
11.异常捕捉
package main
import (
"fmt"
)
func test(){
defer func(){
err:=recover()
if err!=nil{
fmt.Println("err=",err)
}
}()
num1:=10
num2:=2
res:=num1/num2
fmt.Println("res=",res)
}
func main(){
test()
}