函数
Go语言 函数是反过来声明 变量类型和 函数返回值
一。一个返回值
package main
import "fmt"
func max(a int,b int) int { //先参数 后返回值
if a>b {return a}
return b
}
func main() {
fmt.Println(max(4,5))
}
二。两个返回值
package main
import "fmt"
func main() {
v,e:=multi_ret("one")
fmt.Println(v,e) //输出1 true
v, e = multi_ret("four")
fmt.Println(v,e) //输出0 false
//通常的用法 注意分号后有 e
if v,e=multi_ret("four");e{
//正常返回
} else {
//错误返回
}
}
func multi_ret(key string)(int,bool){
m:=map[string]int{"one":1,"two":2,"three":3}
var err bool
var val int
val,err=m[key]
return val,err
}
三。参数数量不定
package main
import "fmt"
func sum(nums ...int){
fmt.Println(nums," ")//输出如[1,2,3]之类数组
total :=0
for _,num:=range nums{//要的是值而不是下标
total+=num
}
fmt.Println(total)
}
func main(){
sum(1,2)
sum(1,2,3)
//传数组
nums :=[]int{1,2,3,4}
sum(nums...)
}
四。函数的闭包和递归
(一)斐波那契数列
package main
import "fmt"
func nextNum() func() int {
i,j:=1,1
return func() int {
var tmp =i+j
i,j=j,tmp
return tmp
}
}
func main() { //打印下一个 斐波那契数
nextNumFunc:=nextNum()
for i:=0;i<10;i++{
fmt.Println(nextNumFunc())
}
}
(二)阶乘
package main
import "fmt"
func fact(n int) int {
if n==0{
return 1
}
return n*fact(n-1)
}
func main() {
fmt.Println(fact(5))
}
(三)import另外的文件
结构体
package main
import "fmt"
type rect struct { //结构体
width,height int
}
func (r *rect) area() int{//求面积
return r.width*r.height
}
func (r *rect) perimeter() int { //求周长
return 2*(r.width+r.height)
}
func main(){
r:=rect{width:10,height:15}
fmt.Println("面积:",r.area())
fmt.Println("周长:",r.perimeter())
rp:=&r //指针
fmt.Println("面积:",rp.area())
fmt.Println("周长:",rp.perimeter())
}
接口 多态
package main
import "fmt"
import "math"
//----接口----//
type shape interface{
area() float64 // 计算面积
perimeter() float64 //计算周长
}
//----长方形----//
type rect struct {
width float64
height float64
}
func (r *rect) area() float64{//求面积
return r.width*r.height
}
func (r *rect) perimeter() float64 { //求周长
return 2 * (r.width + r.height)
}
//----圆形----//
type circle struct {
radius float64
}
func (c*circle) area() float64{ //面积
return math.Pi*c.radius*c.radius
}
func (c*circle) perimeter() float64{ //周长
return 2*math.Pi*c.radius
}
//----接口的使用----//
func interface_test(){
r :=rect{width:3,height:4}
c :=circle{radius:5}
s:=[]shape{&r,&c} //通过指针实现
for _,sh:=range s{
fmt.Println(sh)
fmt.Println(sh.area())
fmt.Println(sh.perimeter())
}
}
func main() {
interface_test()
}