05 기능, 패키지 및 오류 처리

함수

특정 기능 프로그램 명령어 세트 정의 문법을 완료합니다.

func 函数名(形参列表)(返回值列表){
    
    
	 执行语句
	 return 返回值列表
}

샘플 코드

func main () {
    
    
	fmt.Println("结果==",cal(1.1,3.0,'+'))//4.1
}
func cal ( n1 float64, n2 float64,opreator byte)( float64){
    
    
	var res float64
	switch opreator {
    
    
		case '+':
			res = n1 + n2
		case '-':
			res = n1 - n2
		case '*':
			res = n1 * n2
		case '/':
			res = n1 / n2
		default:
			fmt.Println("操作符不正确")

	}
	return res

}

다중 값 반환 코드 예

func main () {
    
    
	//fmt.Println("结果==",util.Cal(1.1,3.0,'+'))//4.1
	res1,res2 := getSumAndSub(1,2)
	res3,_ := getSumAndSub(1,2)
	fmt.Println(res1,res2,res3)
}
func getSumAndSub(n1 int ,n2 int)(int,int){
    
    
	sum := n1 + n2
	sub := n1 - n2
	return sum,sub
}
//声明返回值名称
func getSumAndSub2(n1 int ,n2 int)(sum int,sub int){
    
    
	sum = n1 + n2
	sub = n1 - n2
	return 
}
//可变参数
func getSum(n1 int,args... int) int {
    
    
	var res int = n1
	for i :=0 ; i<len(args); i++{
    
    
		res += args[i]
	}
	return res
	
}

주의 사항

  1. 함수 전송에서 기본 데이터 유형과 배열은 기본적으로 모두 값 전송입니다. 즉, 값이 복사되고 함수의 수정은 원래 값에 영향을주지 않습니다. 함수의 값을 변경하려는 경우 함수 외부의 값에 영향을 미치면 & num 주소를 전달할 수 있습니다. 함수 포인터 방식으로 변수를 조작합니다.
  2. Go는 함수 오버로딩을 지원하지 않습니다.
  3. Go의 함수도 변수에 할당 할 수있는 유형이며 변수를 통해 함수를 호출 할 수 있습니다.
  4. 함수는 형식 매개 변수로 함수에 전달 될 수 있습니다.
  5. 함수의 반환 값 이름 지정을 지원합니다. 반환 이름을 지정한 후 반환 할 값을 추가 할 필요가 없습니다. 선언 된 반환 값 변수를 자동으로 반환
  6. Go 함수는 변수 매개 변수를 지원합니다.

꾸러미

동일한 이름의 함수 변수를 구별하고 코드 파일의 범위를 더 잘 관리하고 함수 변수를 제어
하는 데 사용됩니다. go의 각 폴더는 패키지입니다.

주의 사항

  1. 파일을 패키징 할 때 패키지는 일반적으로 소문자로 된 폴더와 동일한 예의 package utils 및 package main과 같은 폴더에 해당합니다.
  2. 파일이 다른 패키지의 함수 나 변수를 사용해야하는 경우 해당 경로를 먼저 가져와야합니다 (예 : 예제의 go01 / utils 가져 오기). 패키지를 가져올 때 Go 컴파일러는 아래의 src에서 경로를 자동으로 검색합니다. GOPATH를 클릭하고 콘텐츠를 가져옵니다.
  3. 패키지의 메서드 변수가 다른 패키지에서 참조되는 경우 첫 글자는 대문자 여야합니다.
  4. 다른 패키지 내용을 호출 할 때 패키지 이름 및 함수 이름 방법을 사용하십시오.
  5. 패키지 이름이 매우 긴 경우 가져올 때 다음과 같이 별칭을 지정할 수 있습니다. import util“go01 / utils”패키지 이름을 가져온 후에는 원래 패키지 이름을 사용할 수 없습니다.
  6. 동일한 패키지에 동일한 함수 이름 또는 변수 이름이있을 수 없습니다. 그렇지 않으면 반복 정의가 표시됩니다.
  7. 실행 가능한 프로그램 파일로 컴파일하려면 패키지를 main으로 선언해야합니다. 이것은 문법 사양입니다. 라이브러리로 컴파일하면 패키지 이름을 사용자 지정할 수 있습니다.


main.go 아래 코드 샘플 go01 / main

package main
import (
	"fmt"
	util "go01/utils"
)
func main () {
    
    
	fmt.Println("结果==",util.Cal(1.1,3.0,'+'))//4.1
}

go01 / utils 아래 util.go

package utils

import (
	"fmt"
)

func Cal ( n1 float64, n2 float64,opreator byte)( float64){
    
    
	var res float64
	switch opreator {
    
    
		case '+':
			res = n1 + n2
		case '-':
			res = n1 - n2
		case '*':
			res = n1 * n2
		case '/':
			res = n1 / n2
		default:
			fmt.Println("操作符不正确")

	}
	return res

}

초기화 기능

각 파일에는 실행 전 초기화 작업에 사용되는 init 함수가 포함될 수 있으며, 함수가 main 함수에서 실행되기 전에 Go 런타임 프레임 워크에서 호출됩니다.
조심해

  1. 파일에 전역 변수 정의가 동시에 포함 된 경우 init 함수와 주 함수의 실행 순서는 전역 변수 정의-> init 함수-> 주 함수입니다.
  2. main.go가 util.go를 호출하고 둘 다 init 메소드와 전역 변수 정의를 포함하는 경우 실행 순서는 다음과 같습니다. uitl 변수 정의-> util init-> 기본 변수 정의-> 기본 init 메소드-> 기본 기본 메소드

func init(){
    
    
	fmt.Println(" main init被执行...")
}

익명 기능

익명 함수는 이름이없는 함수입니다. 함수가 한 번만 사용되는 경우 익명 함수 사용을 고려하십시오. 익명 함수는 샘플 프로그램 에서 여러 번 호출 할 수도 있습니다.

func test1(){
    
    
	//定义好函数后直接调用
	res1 := func(n1 int,n2 int) int {
    
    
		return n1 + n2
	}(1,2)
	fmt.Println(res1)
	//将匿名函数赋值给 变量 然后通过变量调用,
	//如果将函数赋值给 全局变量那么 函数可以全局调用
	a := func(n1 int,n2 int) int {
    
    
		return n1 + n2
	}
	fmt.Println(a(1,2))
}

폐쇄

클로저는 전체적으로 함수와 관련 참조 환경의 조합입니다.
테스트 코드

func test2(){
    
    
	f1 := AddUpper(5);
	fmt.Println(f1(1))
	fmt.Println(f1(2))
}

// 定义一个函数 AddUpper 传入一个初始值 ,返回一个函数 
// 函数调用时在 初始值基础上增加固定值


func AddUpper(n1 int) func(int) int{
    
    
	var n int = n1
	return func (x int) int{
    
    
		n = n + x
		return n
	}
}

기능 연기

함수에서 프로그래머는 종종 리소스 (데이터베이스 연결, 잠금 등)를 만들어야하며 해당 리소스는 함수가 실행 된 후에 해제되어야합니다. Go는이를 위해 지연 지연 메커니즘을 제공합니다. 주의를 기울이는 것이 더 편리
합니다.

  1. go가 참조를 위해 실행되면 defer 이후의 문은 즉시 실행되지 않지만 defer 이후의 문은 스택에 눌러지고 다음 문이 실행됩니다.
  2. 함수가 실행 된 후 명령문은 지연 스택에서 순차적으로 꺼내어 실행됩니다.
  3. defer가 명령문을 스택에 넣으면 관련 값도 스택에 복사됩니다. 메서드의 값 유형 변수 변경은 스택의 값에 영향을주지 않습니다.

샘플 코드

func test3(n1 int,n2 int ) int {
    
    
	defer fmt.Println("ok1 n1=",n1)//10
	defer fmt.Println("ok2 n2=",n2)//20
	n1++
	n2++
	res := n1 + n2
	fmt.Println("res =",res)//32
	return res
}

가변 범위

  1. 함수 또는 명령문 블록에 정의 된 변수의 범위는이 명령문 블록입니다.
  2. 함수 외부에서 선언 된 변수는 전역 변수이고 범위는 실제 패키지이며 첫 글자가 대문자이면 범위는 전체 프로그램입니다.

일반적으로 사용되는 기능

일반적으로 사용되는 문자열 함수

func test02(){
    
    

	var str = "hahaz中文1243";
	fmt.Println("字符串长度",len(str))
	//字符串遍历 同时处理有中文的问题
	r := []rune(str)
	for i :=0;i<len(r);i++{
    
    
		fmt.Printf("字符=%c",r[i]) 
		fmt.Println("") 
	}
	//字符串 转整型
	n,err := strconv.Atoi("12")
	fmt.Println("转整型:",n,err) 
	//整数转字符串
	n2 := strconv.Itoa(12)
	fmt.Println("转字符串:",n2) 
	//字符串 转 byte数组
	var tytes = []byte(str)
	fmt.Println("转字[]byte:",tytes) 
	//  byte数组 转 字符串
	var str2 = string(tytes)
	fmt.Println("[]byte转字符串:",str2) 
	//10进制转 2、8、16进制
	str2 = strconv.FormatInt(16,2)
	fmt.Println("2进制:",str2) 
	str2 = strconv.FormatInt(16,8)
	fmt.Println("8进制:",str2) 
	str2 = strconv.FormatInt(16,16)
	fmt.Println("16进制:",str2) 

	//字符串包含
	fmt.Println("是否包含:",strings.Contains("seafood","foo")) 
	fmt.Println("包含子字符串数量:",strings.Count("seafood","foo")) 
	fmt.Println("是否相同:",strings.EqualFold("Foo","foo")) 
	fmt.Println("子字符串第一次出现位置:",strings.Index("seafood","foo")) 
	fmt.Println("转大写:",strings.ToLower("sSEafood")) 
	fmt.Println("转小写:",strings.ToUpper("seafood")) 
	fmt.Println("去除两端空格:",strings.TrimSpace("  seafood  ")) 
	fmt.Println("去除两边空格和指定字符:",strings.Trim("sssesafoodsss","s")) 
	fmt.Println("去除左边空格和指定字符:",strings.TrimLeft("sssseafoodsss","s")) 
	fmt.Println("去除右边空格和指定字符:",strings.TrimRight("sssseafoodsss","s")) 
	fmt.Println("子字符串最后出现的位置:",strings.LastIndex("se123afood123","123")) 
	fmt.Println("替换字符串:",strings.Replace("se123afood123","123","1~3",-1))
	fmt.Println("判断字符串开头:",strings.HasPrefix("http://123.com","http"))
	fmt.Println("判断字符串结尾",strings.HasSuffix("http://123.com","com"))
	fmt.Println("字符串拆分========")
	strArr := strings.Split("zhagnsna,lisi",",")
	for i:=0;i<len(strArr);i++{
    
    
		fmt.Println(strArr[i])
	}

}

시간 및 날짜 기능

func test03(){
    
    
   now := time.Now()
   fmt.Printf("当前时间 :%v,type: %T",now,now)
   fmt.Println()
   fmt.Println("当前时间信息:",now.Year(),now.Month(),now.Day(),
   now.Hour(),now.Minute(),now.Second())

	//Printf格式化时间 
	fmt.Printf("当前时间 :%d年%d月%d日%d时%d分%d秒",
	now.Year(),now.Month(),now.Day(),now.Hour(),
	now.Minute(),now.Second())
	fmt.Println()
	//time.Format 格式化日期 格式中的数字不能变 2006-01-02 15:04:05
	fmt.Println("当前时间:"+now.Format("2006-01-02 15:04:05"))

	//每100毫秒打印一个数字 
	for i:=0;i<10;i++{
    
    
		fmt.Println(i)
		time.Sleep(time.Millisecond * 100)
	}
	
	//h获取 从 1970年1月1日到指定时间 经过的时间  单位分别为秒和纳秒
	fmt.Printf("unix时间戳:%v unixnano时间戳:%v \n",now.Unix(),now.UnixNano())
	fmt.Println()

	fmt.Println()
}

내장 함수
Golang은 프로그래밍의 편의를 위해 직접 사용할 수있는 몇 가지 함수를 제공하며이를 내장 함수라고합니다.

  1. len : 문자열, 배열, 슬라이스, 맵, chnnel과 같은 길이를 찾는 데 사용됩니다.
  2. 신규 : 메모리를 할당하는 데 사용되며, 주로 다음과 같은 값 유형을 할당하는 데 사용됩니다. int float32, struc는 포인터를 반환합니다.
  3. make : 메모리 할당에 사용되며 주로 채널 맵 슬라이스와 같은 참조 유형을 할당하는 데 사용됩니다.
func test04(){
    
    
	fmt.Println(len("123"))

	num := new(int) // *int 类型
	*num = 100
	fmt.Printf("num 类型 %T,num 的值 %v,num 地址 %v  %v \n",
	num,*num,&num,*num)

}

오류 처리

기본적으로 오류 발생 후 프로그램이 종료되며, 오류를 캡처 및 처리하고 관리자 (email \ SMS)에게 알림을 설정할 수 있습니다.

  1. Golang은 우아한 소개를 추구하므로 전통적인 try catch finally 문을 지원하지 않습니다.
  2. 패닉 복구 지연을 통해 프로그램에서 패닉 예외가 발생했으며, 지연은 복구에 의해 예외가 포착되어 처리되었습니다.
  3. Golang은 사용자 지정 오류를 지원합니다.
func test05(){
    
    
	defer func(){
    
    
		err := recover()
		if err != nil{
    
    
			fmt.Println("err=",err)
		}
	}()
	num1 :=10
	num2 :=0
	res :=num1/num2
	fmt.Println("res=",res)
}

//抛出自定义异常
func test06(){
    
    
	defer func(){
    
    //处理异常
		err := recover()
		if err != nil{
    
     
			fmt.Println("test 06 err=",err)
		}
	}()
	err :=errTest("hei")
	if err != nil {
    
    
		panic(err)//抛出异常
	}
	fmt.Println("抛出异常后还能执行吗")

}
func errTest( name string)(err error){
    
    
	defer func(){
    
    
		err := recover()
		if err != nil{
    
    
			fmt.Println("error Test err=",err)
		}
	}()
	if name == "zhangsan"{
    
    
		return nil
	}else{
    
    
		return errors.New("参数不合法")
	}
}

추천

출처blog.csdn.net/zhangxm_qz/article/details/114399427