山不在高,有仙則名
水不在深,有龍則靈
函數
函數可以說是所有程序的核心,不同的語言之間,函數的定義也不盡相同,大同小異,下面就Go
的函數做個簡單記錄
定義
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
//這里是處理邏輯代碼
//返回多個值
return value1, value2
}
下面看看在c
語言中和Objective-C
中的定義方式
c語言定義方式
type funcName(type1 input1,type2 input2)
Objective-C定義方式
- (type)funcName:(type1 )input1 param:(type2)input2
從上面我們可以看出,其實在函數的定義上,基本上都是一樣的,都由返回類型
,函數名
,入參
組成,但是在go
中有個比較特殊的就是返回值,居然可以有多個返回值,是讓我挺驚訝的,在Objective-C
中,如果需要返回多個返回值,可以返回一個數組,用數組來裝這多個返回值。
下面來看看go
中函數的簡單使用
一般函數
//函數測試
func moreReturnFunc(a int,b int)(c int,d int) {
c = a*b
d = a/b
return c,d;
}
//返回數組
func arrayReturnFunc(a int,b int)([]int) {
c := a+b;
d := a-b;
e := []int{c,d}
return e;
}
//無返回值
func noReturn(width float64,height float64) {
area := width * height
println(area)
}
在go
中,函數的定義可以有返回值也可也沒有返回值,在多返回值函數中,返回的時候可以不用帶上變量名,如下面這樣
//不帶返回值
func moreReturnFunc(a int,b int)(int,int) {
return a*b, a/b
}
當然在程序中,還是建議寫上參數,這樣方便理解和使用
可變參數
顧名思義,就是有著不定數量的參數的函數,下面我們來看看定義
func funcName(arg ...int) {}
看看使用方法
//可變參數
func sum(num ...int) {
fmt.Println(num)
total := 0
for _,value := range num{
total += value
}
fmt.Println(total)
}
//主函數
func main() {
//多返回值
mm,bb := moreReturnFunc(20,5)
fmt.Println(mm,bb)//輸出結果 100 4
//返回數組函數調用
fmt.Println(arrayReturnFunc(50,5)[0],arrayReturnFunc(50,5)[1])//輸出結果55 45
//多個參數
sum(1,2,3,4)//輸出結果[1 2 3 4] 10
//如果參數在數組里,需要加...
sum([]int{1,2,3,4,5}...)//輸出結果[1 2 3 4 5] 15
}
大概使用過程就這樣
傳指針
關于傳指針這個問題,其實就是我們需不需要讓入參的值發生變化,在c
語言或者是Objective-C
中如果入參為int
、float
等,那么當我們在函數中對入參進行修改時,實際上是傳了這個值的一份copy
,當在被調用函數中修改參數值的時候,調用函數中相應實參不會發生任何變化,因為數值變化只作用在copy
上。怎么說了,大概就是這樣的
//主函數
func main() {
plusA := 10
plusB := 5
fmt.Println(plus(&plusA,&plusB),plusA)
}
func plus(a *int,b *int) int {
*a = *a - *b
return *a
}
//輸出結果為:5 5這里由于傳了指針,當*a = *a-*b的時候,改變的同一地址也就是plusA的值,所以當我們輸出plusA的時候,值也就改變了
可以看看不傳指針的情況
//主函數
func main() {
plusA := 10
plusB := 5
fmt.Println(plus(plusA,plusB),plusA)
}
func plus(a int,b int) int {
a = a - b
return a
}
輸出結果為 :5 10
注意上面傳指針的時候,在調用函數的時候需要添加&
符號,傳指針的方法和在Objective-C
中參數是對象差不多,當然前提是不是copy
屬性
函數作為參數類型
將函數作為參數類型之前,我們首先需要將函數定義一個類型,定義方式為
type typeName func (inputType) outType
其實就是將函數的原型定義成一個類型
可以看看具體使用,就對上面的函數進行改造添加幾個函數測試
//主函數
func main() {
plusA := 10
plusB := 5
fmt.Println(plus(plusA,plusB,sum,moreReturnFunc),plusA)
}
//定義類型
type moreParatest func (arg...int) int
type moreReturnParatest func (int,int) (int,int)
func plus(a int,b int,c moreParatest,d moreReturnParatest) int {
n,m:=moreReturnFunc(4,2)
a = a - b + c(1,2,3,4,5) + n + m
return a
}
func sum(num ...int) int {
fmt.Println(num)
total := 0
for _,value := range num{
total += value
}
fmt.Println(total)
return total
}
func moreReturnFunc(a int,b int)(c int,d int) {
c = a*b
d = a/b
return c,d;
}
在上面的例子中,我先定義了兩個類型的函數--moreParatest
和moreReturnParatest
,這兩個函數一個是傳入多個參數返回int
,一個是傳入兩個int
然后返回兩個int
返回值的函數,在plus
函數中,將類型直接作為參數傳入函數中,這樣我們的參數c
和d
就相當于兩個函數,在plus
函數中,我們在調用他們,具體函數實現就不去管他。
在plus
函數定義好之后,我們在main
函數中進行調用,由于我們的sum
函數和moreReturnFunc
分別對應滿足定義的函數類型,所以直接將該兩個函數當作參數傳入即可
最終結果如下
30 10
通過這樣的方式,我們的程序可以變得非常靈活,特別是在封裝接口的時候