Go Simple Demo
一、利用闭包输出斐波那契数列#
package main
import "fmt"
func Fibonacci() func() int {
first := 1
second := 1
return func() int {
temp := first + second
first = second
second = temp
return temp
}
}
func main() {
f := Fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
二、反转字符串#
package main
import "fmt"
func reverse(s string) string {
slc := []rune(s)
for i, j := 0, len(slc)-1; i < j; i, j = i+1, j-1 {
slc[i], slc[j] = slc[j], slc[i]
}
return string(slc)
}
func main() {
fmt.Println(reverse("学习Go语言"))
}
三、实现Linux系统中的cat命令,用以读取文件内容#
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
var numberFlag = flag.Bool("n", false, "number each line")
func cat(r *bufio.Reader) {
i := 1
for {
buf, err := r.ReadBytes('\n')
if err == io.EOF {
break
}
if *numberFlag {
fmt.Fprintf(os.Stdout, "%5d %s", i, buf)
i++
} else {
fmt.Fprintf(os.Stdout, "%s", buf)
}
}
return
}
func main() {
flag.Parse()
if flag.NArg() == 0 {
cat(bufio.NewReader(os.Stdin))
}
for i := 0; i < flag.NArg(); i++ {
f, err := os.Open(flag.Arg(i))
if err != nil {
fmt.Fprintf(os.Stderr, "%s:error reading from %s: %s\n", os.Args[0], flag.Arg(i), err.Error())
continue
}
cat(bufio.NewReader(f))
}
}
四、多协程输出1-200000之间的所有素数#
创建多协程执行的函数#
函数一:向管道intChan写入需要判断是否为素数的所有整数#
func intNum(count int, intChan chan int) {
for i := 3; i <= count; i++ {
intChan <- i
}
fmt.Println("存放所有整数的协程已完成")
close(intChan)
}
函数二:从intChan中取出整数,并进行判断:若为素数则放入管道primeChan;当协程完毕后,向管道exitChan写入一个bool值#
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool, count int) {
for {
n, ok := <-intChan
// 检测到intChan无数据后停止读取
if !ok {
break
}
// 判断n是否为素数
flag := false
for i := 2; i < n; i++ {
if n%i == 0 {
break
}
flag = true
}
if flag {
// 若为素数,将n写入到primeChan
primeChan <- n
}
}
// 一个协程完成后便向exitChan写入一个值
fmt.Println("一个存放素数的协程已完成")
exitChan <- true
}
主线程#
func main() {
count := 200000 // 定义整数范围
intChan := make(chan int, 1000) // 创建一个存放所有整数的管道
primeChan := make(chan int, 1000) // 创建一个存放所有素数的管道
exitChan := make(chan bool, 4) // 创建一个存放4个协程的管道
go intNum(count, intChan)
// 开启四个协程执行函数primeNum()
for i := 1; i <= 4; i++ {
go primeNum(intChan, primeChan, exitChan, i)
}
// 待exitChan存满4个协程后关闭primeChan
go func() {
for i := 0; i < 4; i++ {
<-exitChan
}
close(primeChan)
}()
// 遍历primeChan输出结果
for {
res, ok := <-primeChan
if !ok {
break
}
fmt.Println(res)
}
fmt.Println("主线程结束")
}
结果#
作者:koktlzz
出处:https://www.cnblogs.com/koktlzz/p/14158993.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现