1、基礎(chǔ)類型
package main
?
import "fmt"
?
//名在前,類型在后,同類型可以:a,b int
func eval( a,b int, op string ) int{
switch op{
case "+":
return a+b
case "-":
return a-b
case "*":
return a*b
case "/":
return a/b
default:
panic("unsupported operation: " + op)
}
}
?
func main() {
fmt.Println( eval(3,5,"*") )
}
2、可以返回多個(gè)值
package main
?
import "fmt"
?
//帶余除法:13 / 4 = 3...1
func div( a,b int ) ( int, int ){
return a/b, a%b
}
?
func main() {
fmt.Println( div(13,4) )
}
一般多返回值用來返回錯(cuò)誤
package main
?
import "fmt"
?
//返回了結(jié)果和error
func eval( a,b int, op string ) (int, error){
switch op{
case "+":
return a+b, nil
case "-":
return a-b, nil
case "*":
return a*b, nil
case "/":
q, _ := div(a,b)
return q, nil
default:
return 0, fmt.Errorf("unsupported operation: " + op)
}
}
?
func div( a,b int ) ( q,r int ){
return a/b, a%b
}
?
func main() {
fmt.Println( eval(13,2, "=") ) // output: 0 unsupported operation: =
if result, err := eval(13,4,"x" ); err != nil{
fmt.Println("Error:", err )
}else{
fmt.Println(result)
} // output: Error: unsupported operation: x
fmt.Println( eval(13,2, "/") ) // output: 6 <nil>
}
3、可以給返回值取名字,一般用于簡單的函數(shù)
package main
?
import "fmt"
?
//可以給返回值取名字
func div( a,b int ) ( q,r int ){
return a/b, a%b
}
?
func main() {
q, r := div(13,4) //因?yàn)楹瘮?shù)返回值有名字,那么編譯器自動(dòng)生成名字時(shí)就會(huì)生成和函數(shù)返回值一樣的名字,雖然不知道快捷鍵是啥。。。
fmt.Println(q, r)
}
4、多個(gè)返回值時(shí),如果只想接收一個(gè)返回值,另外一個(gè)返回值不用,可以使用_
package main
?
import "fmt"
?
//名在前,類型在后,同類型可以:a,b int
func eval( a,b int, op string ) int{
switch op{
case "+":
return a+b
case "-":
return a-b
case "*":
return a*b
case "/":
q, _ := div(a,b) //這里不可以寫q, r := div(a,b),因?yàn)槎xr卻不使用是不允許的
return q
default:
panic("unsupported operation: " + op)
}
}
?
//帶余除法:13 / 4 = 3...1
//可以給返回值取名字
func div( a,b int ) ( q,r int ){
return a/b, a%b
}
?
func main() {
fmt.Println( eval(13,2, "/") )
}
5、go語言函數(shù)式編程,函數(shù)可以作為參數(shù)
ackage main
?
import (
"fmt"
"reflect"
"runtime"
"math"
)
?
func apply( op func( int, int) int, a,b int) int {
p := reflect.ValueOf(op).Pointer()
opName := runtime.FuncForPC(p).Name() //獲得函數(shù)名
fmt.Printf("Calling function %s with args " + "(%d,%d)\n", opName, a, b ) //打印函數(shù)名和參數(shù)
return op( a, b )
}
?
func pow( a,b int) int {
return int(math.Pow( float64(a), float64(b) ))
}
?
func main() {
fmt.Println( apply(pow, 3,4) ) // output: Calling function main.pow with args (3,4) 81
}
6、匿名函數(shù)
package main
?
import (
"fmt"
"reflect"
"runtime"
"math"
)
?
func apply( op func( int, int) int, a,b int) int {
p := reflect.ValueOf(op).Pointer()
opName := runtime.FuncForPC(p).Name() //獲得函數(shù)名
fmt.Printf("Calling function %s with args " + "(%d,%d)\n", opName, a, b ) //打印函數(shù)名和參數(shù)
return op( a, b )
}
?
func main() {
// apply第一個(gè)參數(shù)可以使用匿名函數(shù)
fmt.Println( apply( func(a,b int) int{
return int( math.Pow( float64(a), float64(b) ) )
}, 3,4) ) // output: Calling function main.main.func1 with args (3,4) 81
}
7、可變參數(shù)列表
package main
import "fmt"
func sum( numbers ...int ) int {
s := 0
for i := range numbers {
s += numbers[i]
}
return s
}
func main() {
fmt.Println( sum( 1,2,3,4,5 ) )
}