Loading

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("主线程结束")
}

结果

WeChatee1cb3f52a63662e6d821a209be4c993

posted @ 2020-12-19 14:28  koktlzz  阅读(80)  评论(0编辑  收藏  举报