함수
특정 기능 프로그램 명령어 세트 정의 문법을 완료합니다.
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
}
주의 사항
- 함수 전송에서 기본 데이터 유형과 배열은 기본적으로 모두 값 전송입니다. 즉, 값이 복사되고 함수의 수정은 원래 값에 영향을주지 않습니다. 함수의 값을 변경하려는 경우 함수 외부의 값에 영향을 미치면 & num 주소를 전달할 수 있습니다. 함수 포인터 방식으로 변수를 조작합니다.
- Go는 함수 오버로딩을 지원하지 않습니다.
- Go의 함수도 변수에 할당 할 수있는 유형이며 변수를 통해 함수를 호출 할 수 있습니다.
- 함수는 형식 매개 변수로 함수에 전달 될 수 있습니다.
- 함수의 반환 값 이름 지정을 지원합니다. 반환 이름을 지정한 후 반환 할 값을 추가 할 필요가 없습니다. 선언 된 반환 값 변수를 자동으로 반환
- Go 함수는 변수 매개 변수를 지원합니다.
꾸러미
동일한 이름의 함수 변수를 구별하고 코드 파일의 범위를 더 잘 관리하고 함수 변수를 제어
하는 데 사용됩니다. go의 각 폴더는 패키지입니다.
주의 사항
- 파일을 패키징 할 때 패키지는 일반적으로 소문자로 된 폴더와 동일한 예의 package utils 및 package main과 같은 폴더에 해당합니다.
- 파일이 다른 패키지의 함수 나 변수를 사용해야하는 경우 해당 경로를 먼저 가져와야합니다 (예 : 예제의 go01 / utils 가져 오기). 패키지를 가져올 때 Go 컴파일러는 아래의 src에서 경로를 자동으로 검색합니다. GOPATH를 클릭하고 콘텐츠를 가져옵니다.
- 패키지의 메서드 변수가 다른 패키지에서 참조되는 경우 첫 글자는 대문자 여야합니다.
- 다른 패키지 내용을 호출 할 때 패키지 이름 및 함수 이름 방법을 사용하십시오.
- 패키지 이름이 매우 긴 경우 가져올 때 다음과 같이 별칭을 지정할 수 있습니다. import util“go01 / utils”패키지 이름을 가져온 후에는 원래 패키지 이름을 사용할 수 없습니다.
- 동일한 패키지에 동일한 함수 이름 또는 변수 이름이있을 수 없습니다. 그렇지 않으면 반복 정의가 표시됩니다.
- 실행 가능한 프로그램 파일로 컴파일하려면 패키지를 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 런타임 프레임 워크에서 호출됩니다.
조심해
- 파일에 전역 변수 정의가 동시에 포함 된 경우 init 함수와 주 함수의 실행 순서는 전역 변수 정의-> init 함수-> 주 함수입니다.
- 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는이를 위해 지연 지연 메커니즘을 제공합니다. 주의를 기울이는 것이 더 편리
합니다.
- go가 참조를 위해 실행되면 defer 이후의 문은 즉시 실행되지 않지만 defer 이후의 문은 스택에 눌러지고 다음 문이 실행됩니다.
- 함수가 실행 된 후 명령문은 지연 스택에서 순차적으로 꺼내어 실행됩니다.
- 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
}
가변 범위
- 함수 또는 명령문 블록에 정의 된 변수의 범위는이 명령문 블록입니다.
- 함수 외부에서 선언 된 변수는 전역 변수이고 범위는 실제 패키지이며 첫 글자가 대문자이면 범위는 전체 프로그램입니다.
일반적으로 사용되는 기능
일반적으로 사용되는 문자열 함수
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은 프로그래밍의 편의를 위해 직접 사용할 수있는 몇 가지 함수를 제공하며이를 내장 함수라고합니다.
- len : 문자열, 배열, 슬라이스, 맵, chnnel과 같은 길이를 찾는 데 사용됩니다.
- 신규 : 메모리를 할당하는 데 사용되며, 주로 다음과 같은 값 유형을 할당하는 데 사용됩니다. int float32, struc는 포인터를 반환합니다.
- 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)에게 알림을 설정할 수 있습니다.
- Golang은 우아한 소개를 추구하므로 전통적인 try catch finally 문을 지원하지 않습니다.
- 패닉 복구 지연을 통해 프로그램에서 패닉 예외가 발생했으며, 지연은 복구에 의해 예외가 포착되어 처리되었습니다.
- 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("参数不合法")
}
}