go语言入门|青训营笔记

98 阅读4分钟

一、函数

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)
}

image.png

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栈的相关值也是独立的,不会因为前面的函数语句而改变 image.png

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()
}

image.png