笔上得来终觉浅,绝知此事要躬行
🔥 个人主页:星云爱编程
🔥 所属专栏:Golang
🌷追光的人,终会万丈光芒
🎉欢迎大家点赞👍评论📝收藏⭐文章
目录
[2.1 init函数](#2.1 init函数)
一、函数
1.1基本介绍
为完成某一功能的程序指令(语句)的集合,称为函数。
在Go中函数分为:系统函数、自定义函数。
1.2基本语法
func 函数名称(参数名 参数类型)返回类型{
执行语句
return 返回值列表
}
说明:
有些函数可以没有return语句
1.3函数调用机制
先看下图代码,有个add函数,我们来分析下该函数是怎么执行的
func add(n1,n2 int)int{
return n1+n2
}
func main(){
n1:=10
n2:=5
sum:=add(n1,n2)
fmt.Printf("sum=%d\n",sum)
}

说明:
(1)当程序执行到函数时,就会开辟一个独立的空间,也就是栈空间;
(2)当函数执行完毕,或者执行到return语句时,就会返回
(3)返回到调用方法的地方
(4)返回后,继续执行方法后面的代码
(5)当main函数(栈)执行完毕,整个程序退出
1.4函数使用细节
- 函数的形参可以有多个,返回值也可以有多个
- 形参列表和返回值列表的数据类型可以是值,也可以是引用类型
- 函数的命名遵循标识符命名规则,首字母不能是数字,首字母大写表示其他包可以使用(即首字母大写为public),首字母小写其他包不能使用(首字母小写为private)
- 函数内的变量只能在函数内使用
- 基本数据类型和数组默认是值传递,即进行值拷贝,在函数内修改,不会影响到原来的值
- Go函数不支持函数重载
- 在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量数据类型就为函数类型,通过该变量可以对函数进行调用
- 在Go中,因为函数是一种数据类型,所以函数可以作为形参,并且调用
- Go支持自定义类型,使用type对函数取别名,目的是简化数据类型定义
- 使用_标识符,忽略返回值
二、常见函数
2.1 init函数
2.1.1基本介绍
每一个源文件丢可以包含一个init函数,该函数会在main函数前被Go运行框架调用,即init函数在main函数前先执行,可以用来作初始化处理。
2.1.2案例
案例1:
func init(){
fmt.Println("init()执行...")
}
func main(){
fmt.Println("main()执行...")
}
说明:运行上面代码可以看到 init函数的确在main函数前执行
案例2:
var n int=test()
func init(){
fmt.Println("init()执行...")
}
func main(){
fmt.Println("main()执行...")
}
func test() int{
fmt.Println("test()执行...")
return 10
}
说明:这次可以看到执行顺序:test()>init()>main(),无论怎么变换他们三个的位置,结果都是一样的,则全局变量的声明在init()前执行
2.1.3使用细节
- 如果一个文件同时包含全局变量定义、init函数和main函数,则执行的流程是:全局变量定义>init函数>main函数
- init最主要的用法是完成初始化工作
2.2匿名函数
2.2.1基本介绍
Go支持匿名函数,匿名函数就是没有名字的函数,如果我们某个函数只使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用
2.2.2使用方式
-
方式一:在定义匿名函数时直接调用
func main(){
//使用匿名函数实现求和
sum:=func (n1,n2 int) int{
return n1+n2
}(10,20);fmt.Printf("sum=%d",sum)
}
-
方式二:将匿名函数赋给一个变量,在通过变量来调用匿名函数
//匿名函数赋给变量 f:=func (n1,n2 int) int{ return n1-n2 } //此时f为 函数类型变量,可以通过f调用函数 num1:=f(100,10) num2:=f(6,3) fmt.Printf("num1=%d\n",num1) fmt.Printf("num2=%d\n",num2)
2.2.3全局匿名函数
将匿名函数赋给一个全局变量,那么这个匿名函数就成为了全局匿名函数,在程序中全局有效
//定义全局匿名函数
var(
f2=func (n1,n2 int)int{
return n1*n2
}
)
func main(){
//使用匿名函数实现求和
sum:=func (n1,n2 int) int{
return n1+n2
}(10,20);
fmt.Printf("sum=%d\n",sum)
//匿名函数赋给变量
f:=func (n1,n2 int) int{
return n1-n2
}
//此时f为 函数类型变量,可以通过f调用函数
num1:=f(100,10)
num2:=f(6,3)
num3:=f2(2,5)
fmt.Printf("num1=%d\n",num1)
fmt.Printf("num2=%d\n",num2)
fmt.Printf("num3=%d\n",num3)
}
2.3字符串函数
在这里列举一些常用的字符串函数
2.3.1函数列举
- len:统计字符串的长度,按字节统计
- []rune(str):字符串遍历,同时处理中文字符,使其正常输出
- strconv.Atoi(str):字符串转整数
- strconv.Itoa(int):整数转字符串
- []byte(str):字符串转[]byte
- string([]byte):[]byte转字符串
- strconv.FormatInt():将整数转成指定进制的字符串
- strconv.ParseInt():字符串转任一进制的整数
- strings.Contains():查看子串是否在字符串中,返回bool值
- strings.Count():统计字符串中指定子串的数目
- strings.Index():返回子串在字符串中第一次出现的位置,没有则返回-1
- strings.Replace():将指定的子串替换为另一个子串
- strings.Split():按照指定的字符分割字符串,返回字符串数组
- strings.ToLower():将字符串的字母全替换为小写
- strings.ToUpper():将字符串的字母全替换为大写
- strings.TrimSpace():将字符串左右两边的空格去除
- strings.Trim():将字符串左右两边指定的字符去除
- strings.TrimLeft():将字符串左边指定的字符去除
- strings.TrimRight():将字符串右边指定的字符去除
- strings.HasPrefix():判断字符串是否以指定的字符串开头
- strings.HasSuffix():判断字符串是否以指定的字符串结尾
2.3.2使用案例
案例一:1~4函数使用
import (
"fmt"
"strconv"
)
//字符串函数使用
func main(){
//(1)len:统计字符串的长度,按字节统计
var str string="hello,world"
n:=len(str)
fmt.Printf("str的长度为:%d\n",n)//11
//Go统一使用utf-8编码,一个英文字母1byte,一个中文3byte
//(2)[]rune(str):字符串遍历,同时处理中文字符,使其正常输出
str2:="hello,李星云"
for i:=0;i<len(str2);i++{
fmt.Printf("%c",str2[i])//有中文,直接输出会有乱码
}
fmt.Println("")
str3:=[]rune(str2)
for i:=0;i<len(str3);i++{
fmt.Printf("%c",str3[i])//此时没有乱码
}
fmt.Println("")
//(3)
//strconv.Atoi(str):字符串转整数
//strconv.Itoa(int):整数转字符串
str4:="52354"
num1,_:=strconv.Atoi(str4)
fmt.Printf("str4的类型为%T,值为%v\n num1的类型为%T,值为%v\n",str4,str4,num1,num1)
str5:=strconv.Itoa(num1)
fmt.Printf("str5的类型为%T,值为%v\n num1的类型为%T,值为%v\n",str5,str5,num1,num1)
}
案例二:5~8
func main(){
//(5)[]byte(str):字符串转[]byte
str1:="hello,Go"
var bytes =[]byte(str1)
fmt.Printf("bytes的类型为%T,值为%v\n",bytes,bytes)
//(6)string([]byte):[]byte转字符串
str2:=string(bytes)
fmt.Printf("str2的类型为%T,值为%v\n",str2,str2)
//(7)strconv.FormatInt():
//func FormatInt(i int64, base int) string
//返回i的base进制的字符串表示。
// base 必须在2到36之间,结果中会使用小写字母'a'到'z'表示大于10的数字
str3:=strconv.FormatInt(4329,10)
fmt.Printf("str3的类型为%T,值为%v\n",str3,str3)
//(8)func ParseInt(s string, base int, bitSize int) (i int64, err error)
//返回字符串表示的整数值,接受正负号。
// base指定进制(2到36),如果base为0,则会从字符串前置判断,
// "0x"是16进制,"0"是8进制,否则是10进制;
// bitSize指定结果必须能无溢出赋值的整数类型,
// 0、8、16、32、64 分别代表 int、int8、int16、int32、int64;
// 返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;
// 如果结果超出类型范围err.Error = ErrRange。
str4:="58023"
n3,_:=strconv.ParseInt(str4,10,64)
fmt.Printf("n3的类型为%T,值为%v\n",n3,n3)
}
2.4时间和日期函数
2.4.1基本介绍
- 使用时间和日期函数,需要导入time包
- 时间变量的类型为time.Time类型
- 通过time.Now获到当前时间
- 通过now可以获取独立的时间元素
- 可以用Format对时间进行格式化输出
- 可以使用time.Sleep进行程序休眠
2.4.2时间常量
Nanosecond 纳秒
Microsecond 微秒=1000纳秒
Millisecond 毫秒=1000微秒
Second 秒=1000毫秒
Minute 分
Hour 时
2.4.3时间戳
- 时间戳(Timestamp)是用于标识特定时间点的数据,通常表示从某一固定时间点(如1970年1月1日00:00:00 UTC,即Unix纪元)到当前时间的秒数或毫秒数。
- 时间戳的作用是可以用来获取随机数
- 有两种方式获取时间戳,分别是Unix()和UnixNano(),二者区别如下

2.4.4案例
案例一:
import (
"fmt"
"time"
)
func main(){
now:=time.Now() //获取当前时间
fmt.Printf("now为%T类型,值为%v\n",now,now)
//通过now可以获取到具体时间
fmt.Printf("年=%v\n",now.Year())
fmt.Printf("月=%v\n",now.Month())
fmt.Printf("日=%v\n",now.Day())
fmt.Printf("时=%v\n",now.Hour())
fmt.Printf("分=%v\n",now.Minute())
fmt.Printf("秒=%v\n",now.Second())
}
案例二:格式化输出时间
func main(){
now:=time.Now() //获取当前时间
fmt.Printf("now为%T类型,值为%v\n",now,now)
//格式化时间日期
//方式一:
fmt.Printf("当前时间:%v年%v月%v日%v时%v分%v秒\n",now.Year(),
int(now.Month()),now.Day(),now.Hour(),now.Minute(),now.Second())
//方式二:
fmt.Printf(now.Format("2006/01/02 15:04:05"))
//说明:"2006/01/02 15:04:05"数字是固定的,不过其结构可以自定义
}
案例三:休眠sleep的使用
func main(){
now:=time.Now() //获取当前时间
fmt.Printf(now.Format("15:04:05\n"))
time.Sleep(1000*time.Millisecond)//休眠1秒
now2:=time.Now()
fmt.Printf(now2.Format("15:04:05"))
}
案例四:时间戳使用
func main(){
now:=time.Now() //获取当前时间
fmt.Println(now.Unix())//Unix时间戳
fmt.Println(now.UnixNano())//UnixNano时间戳
}
2.5内置函数
- len:用来求长度,例如string 、array、slice、map、channel
- new:用来分配内存,主要用来分配值类型
- make:用来分配内存,主要用来分配引用类型
new使用案例
func main(){
n:=new(int)
fmt.Printf("n的类型为%T,值为%v,地址为%v\n",n,n,&n)
}
结语
感谢您的耐心阅读,希望这篇博客能够为您带来新的视角和启发。如果您觉得内容有价值,不妨动动手指,给个赞👍,让更多的朋友看到。同时,点击关注🔔,不错过我们的每一次精彩分享。若想随时回顾这些知识点,别忘了收藏⭐,让知识触手可及。您的支持是我们前进的动力,期待与您在下一次分享中相遇!
路漫漫其修远兮,吾将上下而求索。