目錄6.1.3 函式的呼叫機制
6.1.4 函式的遞迴呼叫
6.1.5 函式的使用細節
6.1.6 練習
函式式程式設計是為解決**復用, 減少**的冗餘.
概念: 為完成某一項功能的程式指令(**語句)的集合, 稱為函式. go中分為自定義函式,
系統內建函式.`
基本語法
func 函式名(形參列表) (返回值列表)
a. 形參列表:表示函式的輸入
b. 函式中的語句: 表示為了實現某一功能**塊
c. 函式可以有返回值, 也可以沒有返回值
快速入門
package main
import (
"fmt"
)func cal(x float64, y float64, operator byte) float64
return res
}func main()
包的基本概念
說明: go的每乙個檔案都是屬於乙個包, 就是說 go是以包的形式來管理檔案和專案目錄結構的.
包的作用
區分相同名字的函式, 變數等識別符號
當程式檔案很多時, 可以很好的管理專案
可以控制函式
,變數
等訪問範圍, 即作用域.
包的相關說明
打包的基本語法
package 報名
包的引用方法
import '包的路徑'
使用細節
再給乙個檔案打包時, 該包對應乙個資料夾, 檔案包名通常和檔案所在的檔名一致, 一般為小寫字母
當乙個檔案要使用其它包的函式或變數時, 需要先導入對應的包
a. package 指令在檔案第一行, 然後時import 指令
b. 匯入包名路徑是從 $gopath 的src 下開始的, 不用帶src, 系統會自動從src下開始引入.
為了使某個包中的函式或者變數可以被其他包引用, 則函式和變數首字母必須是大寫, 類似於 其他語言中的public, 全域性變數.
訪問包中的函式或變數時, 語法:包名.函式名
/包名.變數名
如果包名過長, 可以為包取乙個別名 : 匯入其它包的時候可以為匯入的包名起別名.
同乙個包下: 不能有相同的函式名,或者變數名.
如果要編譯成乙個可執行程式檔案, 就需要將這個包申明為 main, 即package main
再呼叫乙個函式時 : 會給該函式分配乙個新的空間, 編譯器會通過自身的處理讓這個新的空間和其它的棧的空間區分開來
在每個函式對應的棧中, 資料空間(記憶體)時獨立的. 不會混淆
當乙個函式呼叫完畢(執行完畢)後, 程式會銷毀這個函式對應的棧空間
乙個函式在函式體內又呼叫了函式的本身.
乙個示例:
package main
import (
"fmt"
)func foo(x int)
fmt.println("x=", x)
}func main()
示例2:
package main
import (
"fmt"
)func foo2(x int) else
}func main()
遞迴遵守的原則
執行乙個函式時, 就建立了乙個新的受保護的獨立記憶體空間(棧)
函式的區域性變數時獨立的, 不會相互影響
遞迴必須向退出遞迴條件逼近, 否則就是個無限遞迴
!
當乙個函式執行完畢, 或者遇到return, 就會返回, 當函式執行完畢或者返回時, 該函式本身也會被系統所銷毀.
練習
斐波那契數列
使用遞迴方式, 求出 斐波那契數列: 1,1,2,3,5,8,13...
給乙個整數, 求出她的斐波那契數是多少?
package main
import (
"fmt"
)func fei(n int) int else
}func main()
猴子吃桃子問題
有一堆桃子, 猴子第一天吃了其中的一半, 並再多吃乙個! 以後每天猴子都吃其中的一半, 然後在多吃乙個, 當到第十天的時候, 想再吃時(還沒吃), 發現只有乙個桃子了, 問題, 最初共有多少個桃子?
思路分析:1.t = 10,第十天桃子數量 sum(n10) = 1個桃子.
2.t = 9,第九天時桃子的數量sum(n9)= 第十天的桃子數量sum(n10) +1) *2
3.t=x, 第x天使,桃子的數量sum(nx) = 第 x+1 天數量(sum(x+1) +1 ) *2
package main
import (
"fmt"
)func sum(t int) int
if t == 10 else
}func main()
函式的引數可以是多個, 返回值列表也可以是多個.
引數列表 和返回值列表可以是值型別
也可以是引用型別
函式的 命名規範遵循識別符號的命名規範, 首字母不能數數字, 首字母大寫表示該函式可以被本報檔案和其他包檔案呼叫, 首字母小寫只能被本包內部呼叫.
函式中的變數是區域性的, 函式外不生效.
package main
import "fmt"
func foo(x int) int
func main()
基本資料型別 和陣列預設都是值傳遞, 即進行值拷貝. 在函式內修改, 不會影響到原來的值.
如果希望函式內的變數能修改函式外的變數, 可以傳入變數的位址&
, 函式內以指標的方式操作 變數, 類似於 引用傳遞
package main
import (
"fmt"
)// n1 是int的指標型別
func test(n1 *int)
func main()
go中函式不支援傳統的函式過載.(函式名相同,引數不同的函式)
在go中, 函式也是一種資料型別. 可以賦值給乙個變數, 該變數就是乙個函式的型別.通過該變數就可以對函式呼叫.
package main
import (
"fmt"
)func foo(n1 int, n2 int) int
func main()
函式既然是乙個資料型別, 因此在go中, 函式可以作為另乙個函式的引數
, 並且呼叫.
package main
import (
"fmt"
)func a(x int, y int) int
func b(funvar func(int, int) int, num int, num2 int) int
func main()
為了簡化資料型別定義, go支援自定義資料型別
基本語法:type 自定義資料型別別名 資料型別
示例:type mystring string
等價使用了string型別
package main
type myint int //給int取了別名
var myint = 40
9 中的示例可以通過自定義資料型別做如下修改
package main
import (
"fmt"
)//自定義乙個函式的資料型別
type funtype func(int,int) int
func a(x int, y int) int
func b(funvar funtype, num int, num2 int) int
func main()
支援 對函式返回值命名
package main
import "fmt"
func foo(n1 int, n2 int) (sum int, sub int)
func main()
使用_
下劃線識別符號, 忽略返回值
在go中支援可變引數. 可變引數需要放在形參後面. 格式args ... int
package main
import (
"fmt"
)func main()
//使用...表示可變引數
func sum(n1 int, args ... int) int
return sum
}
編寫乙個函式實現兩個int變數值的交換
package main
import (
"fmt"
)func main()
func swap(n1 *int, n2 *int)
golang基礎 函式
函式func 函式名 引數列表 返回值列表 func funcname input1 type1,input2 type2 output1 type1,output2 type2 1 關鍵字 func 用來宣告乙個函式 funcname 2 函式可以有乙個或者多個引數,每個引數後面帶有型別,多個引數...
Golang基礎語法1
開啟cmd命令視窗 儲存,編譯,執行 1.儲存到乙個 go的檔案 我這裡儲存到 e gotest hello.go 下 2.編譯,在命令提示符中執行命令 go build oe gotest hello.exe e gotest hello.go 在指定目錄下生成 exe 檔案 或者go build...
函式指標,func與 func的區別
1.函式名,就是函式的首位址,那麼func與 func應該是不一樣的,偶然看到別人說兩種用法一樣,所以決定試一試。2.環境配置,vscode 模組 c c 0.29.0 編譯器 mingw,x86 64 8.1.0x86 64 8.1.0。3.如下 include include include v...