给定4个协程输入1234,交替输出到4个文件

有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件1234
说明:
文件1输出:123412341234
文件2输出:234123412341
文件3输出:341234123412
文件4输出:412341234123

package main

import (
    "fmt"
    "os"
    "time"
)

type FS struct{
    f *os.File
    next int
}

func putData(c chan int, data int){
    for{
        c<-data
    }
}

func main(){
    var ch [4](chan int)
    for i:=0; i<=3; i++{
        ch[i] = make(chan int ,128)
    }

    for i:=0; i<=3; i++{
        go putData(ch[i], i)
    }

    var fs [4]FS
    for i:=0; i<=3; i++{
        if f, err := os.Create(fmt.Sprintf("%d", i+1)); err == nil{
            fs[i] = FS{f, i}
        }else{
            fmt.Println(err)
        }
    }
    defer func() {
        for i:=0; i<=3; i++{
            fs[i].f.Close()
        }
    }()

    for {
        var data int
        for i:=0; i<=3; i++{
            select {
            case data=<-ch[i]:
                fmt.Println("get data : ", data+1)
            case <-time.After(time.Second*3):
                continue
            }

            for j:=0; j<=3;j++{
                if data == fs[j].next{
                    if _,err := fs[j].f.WriteString(fmt.Sprintf("%d", data+1));err ==nil{
                        fmt.Println("weite data : ", data+1)
                        if fs[j].next == 3{
                            fs[j].next = 0
                        }else {
                            fs[j].next = fs[j].next % 3 + 1
                        }
                    }else{
                        fmt.Println(err)
                    }

                }
            }
        }
        time.Sleep(time.Second)
    }
}

你可能感兴趣的:(给定4个协程输入1234,交替输出到4个文件)