递归实现
//递归算法,计算前面两个数的和
func fibonacci(front int) (back int) {
if front <= 2 {
back = 1
} else {
back = fibonacci(front-1) + fibonacci(front-2) //计算前面两个数的和并返回给back
}
return
}
递归调用
for i := 1; i <= 10; i++ {
result := fibonacci(i)
fmt.Println(result)
}
完整源码:
package main //包名
//导入模块
import (
"fmt" //格式化输出
"reflect" //反射库
//随机库
"time" //时间日期库
)
//接口定义
type Animal interface {
Speak() string //定义一个方法Speak返回类型是字符串
}
//定义Dog结构
type Dog struct {
}
//定义Cat结构
type Cat struct {
}
//在结构Dog中实现接口方法
func (d Dog) Speak() string {
return "Dog Speak"
}
//在结构Cat中实现接口方法
func (c Cat) Speak() string {
return "Cat Speak"
}
//定义一个方法,传入参数是interface{}的集合
func PrintAll(v []interface{}) {
//遍历对象
for _, r := range v {
fmt.Println(r) //输出值
}
}
//反射测试
func CallAll(v []interface{}) {
for _, r := range v {
fmt.Println(reflect.TypeOf(r))
fmt.Println(reflect.TypeOf(r).Kind())
}
}
//协程生产消息
//prefix : 产生的字符串前缀
//ch : 通道
func producer_msg(prefix string, ch chan<- string) { //支持字符串格式通信的通道chan chan<-向通道写数据
//循环产生消息
for {
ch <- fmt.Sprintf("协程生产消息: %s %v", prefix, ch) //将产生的消息写入通道
time.Sleep(time.Second) //等待1秒
}
}
//协程消费消息
func customer_msg(ch <-chan string) { //支持字符串格式通信的通道ch <-chan 读取通道数据
//循环消费消息
for {
msg := <-ch //读取通道数据并保存到msg
fmt.Println("协程消费消息: " + msg) //输出数据
}
}
//递归算法,计算前面两个数的和
func fibonacci(front int) (back int) {
if front <= 2 {
back = 1
} else {
back = fibonacci(front-1) + fibonacci(front-2) //计算前面两个数的和并返回给back
}
return
}
//入口
func main() {
for i := 1; i <= 10; i++ {
result := fibonacci(i)
fmt.Println(result)
}
fmt.Println("hi,go")
animals := []Animal{Dog{}, Cat{}} //初始化集合
//遍历集合
for _, ani := range animals {
v := ani.Speak() //调用接口方法
fmt.Println(v) //输出结果
}
//根据字符串数据生成[]interface{}
names := []string{"stanley", "david", "oscar"}
//生成指定长度的空接口对象集合
vals := make([]interface{}, len(names))
//遍历
for i, v := range names {
vals[i] = v //赋值
}
//调用自定义函数
PrintAll(vals) //传入[]interface{}对象
//转换Dog和Cat结构为interface{}
anis := make([]interface{}, len(animals))
//anis[0] = animals[0].Speak()
//anis[1] = animals[1].Speak()
//遍历集合并给interface{}赋值
for k, v := range animals {
anis[k] = "convert to interface{} : " + v.Speak()
out_kind_type := fmt.Sprintf("Speak: 类型-> %v 种类-> %v", reflect.TypeOf(v.Speak), reflect.TypeOf(v.Speak).Kind())
fmt.Println(out_kind_type)
}
//调用自定义函数输出
PrintAll(anis) //
for k, v := range animals {
anis[k] = v
}
CallAll(anis) //
fmt.Println("class name: " + reflect.TypeOf(Cat{}).Name())
ch := make(chan string) //创建数据通道
go producer_msg("cat", ch) //启动一个协程生产cat数据
go producer_msg("dog", ch) //启动一个协程生产dog数据
//消费上面两个协程产生的数据
customer_msg(ch)
}