go 面试题

有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:

A:1 2 3 4 1 2....

B:2 3 4 1 2 3....

C:3 4 1 2 3 4....

D:4 1 2 3 4 1....

 

上周五面试,面试给了一道go线程的题,当时时间想了一个很笨的方式来实现的,现在优化后附上代码,如果有更好的大牛可以在后面回复!!!

 

package main

import (
    "log"
    "os"
)

func main() {

    a, _ := os.OpenFile("./a.txt", os.O_WRONLY|os.O_APPEND, 0666)
    b, _ := os.OpenFile("./b.txt", os.O_WRONLY|os.O_APPEND, 0666)
    c, _ := os.OpenFile("./c.txt", os.O_WRONLY|os.O_APPEND, 0666)
    d, _ := os.OpenFile("./d.txt", os.O_WRONLY|os.O_APPEND, 0666)
    files := []*os.File{a, b, c, d}
    i := 0
    sign := make(chan int, 1)
    for i < 100 {
        i++
        sign <- 1
        go out1(files[0], sign)
        sign <- 1
        go out2(files[1], sign)
        sign <- 1
        go out3(files[2], sign)
        sign <- 1
        go out4(files[3], sign)

        files = append(files[len(files)-1:], files[:len(files)-1]...)
    }
    a.Close()
    b.Close()
    c.Close()
    d.Close()
}



func out2(f *os.File, c chan int) int {
    f.Write([]byte("2 "))
    // f.Close()
    log.Println(f.Name() + " write finish...")
    <-c
    return 2
}
func out3(f *os.File, c chan int) int {
    f.Write([]byte("3 "))
    // f.Close()
    log.Println(f.Name() + " write finish...")
    <-c
    return 3
}
func out4(f *os.File, c chan int) int {
    f.Write([]byte("4 "))
    // f.Close()
    log.Println(f.Name() + " write finish...")
    <-c
    return 4
}

 

转载于:https://www.cnblogs.com/LoveHe/p/9001813.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值