Go 和其他語言很大的一個不同就是函數(shù)可以返回多個返回值友多。
Go 中聲明的變量必須被使用蹈胡,否則就會報錯通熄,因?yàn)镚o認(rèn)為沒有使用過的變量就不應(yīng)該聲明耙旦;
所以這里就會帶來一個問題喉恋,如果Go函數(shù)返回多個結(jié)果,而我們只關(guān)注其中的一個個母廷,那么另外一個不接受會報錯轻黑,接受不用也會報錯
這種情況我們可以使用一個叫做 blank identifier的變量 _
package main
import(
"bufio"
"fmt"
"os"
)
func main(){
fmt.Print("Enter a grade:")
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
fmt.Println(input)
}
Printf, Sprintf 可以用來format輸出,就像c語言那樣琴昆,需要注意的是一下兩種方式
- %T 返回?cái)?shù)據(jù)所對應(yīng)的類型, int string etc
- %t 表示bool型數(shù)據(jù)氓鄙,true false
- %v 根據(jù)value類型,自動顯示成對應(yīng)類型數(shù)據(jù)的默認(rèn)輸出格式
- %#v 以數(shù)據(jù)在Go語言中的表示形式顯示业舍,如制表符"\t"抖拦, 換行符 "\n"升酣, 等這種非顯示字符,在Go語言中以轉(zhuǎn)義字符的形式出現(xiàn)态罪,那么%#v就是"\t" "\n"
fmt.Printf("\\t show \"%v\", %#v", "\t", "\t")
the output:
\t show " ", "\t"
Go 函數(shù)可以返回多個返回值噩茄,最常見的做法是返回一個正常值加一個error信息,我們可以通過error信息指定在函數(shù)調(diào)用過程中糾結(jié)發(fā)生了什么錯誤
func area(width float64, height float64) (int, error){
if( width < 0){
return 0, errors.New("width cannot be negative")
}
if( height < 0){
return 0, errors.New("height cannot be negative")
}
return width*height, nil
}
Go函數(shù)傳遞參數(shù)有兩種方式复颈,值傳遞方式和引用傳遞方式(指針傳遞方式)绩聘, 上面的例子是值傳遞,即傳進(jìn)去的value是參數(shù)的一個copy, 函數(shù)對copy值的改變不會影響原來的值耗啦;
下面這個是引用傳遞凿菩, 引用傳遞方式傳遞的是值所在的地址,對它的改動將影響外面參數(shù)的值
func area(width *float64 , height *float64 ) (float64, error){
if( *width < 0){
return 0, errors.New("width cannot be negative")
}
if( *height < 0){
return 0, errors.New("height cannot be negative")
}
return (*width)*(*height), nil
}
這里需要注意的是帜讲,不同類型的指針衅谷,類型也不同,因此變量也不能相互賦值似将。
如下代碼片段
value := 12
value2 := 12.3
fmt.Println(reflect.TypeOf(&value))
fmt.Println(reflect.TypeOf(&value2))
&value 的類型是 *int
&value2 的類型是 *float64