2 回答

TA貢獻1828條經驗 獲得超6個贊
您可以使用一個簡單的TCP終端服務器 - 首先運行此TCP終端服務器,并且不需要根據需要關閉它(或者只需使用Netcat命令:然后轉到#2并寫入此TCP連接,例如“127.0.0.1:8080”):nc -l 8080
package main
import (
"io"
"log"
"net"
"os"
)
func main() {
ln, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
log.Fatal(err)
}
for {
w1, err := ln.Accept()
if err != nil {
log.Fatal(err)
}
io.Copy(os.Stdout, w1)
w1.Close()
}
}
然后將其添加到您的代碼中:
w1, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
log.Fatal(err)
}
defer w1.Close()
然后在代碼中用作另一個示例,例如,w1io.Writerfmt.Fprintln(w1, "T1 : ", i)
package main
import (
"fmt"
"log"
"math/rand"
"net"
"sync"
"time"
)
func main() {
w1, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
log.Fatal(err)
}
defer w1.Close()
// your code:
s1 := rand.NewSource(time.Now().UnixNano())
r1 := rand.New(s1)
wg := &sync.WaitGroup{}
t1 := func(wg *sync.WaitGroup) {
for i := 0; i < 100; i++ {
time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))
fmt.Fprintln(w1, "T1 : ", i)
}
wg.Done()
}
t2 := func(wg *sync.WaitGroup) {
for i := 0; i < 100; i++ {
time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))
fmt.Println("T2 : ", i)
}
wg.Done()
}
wg.Add(2)
go t1(wg)
go t2(wg)
wg.Wait()
}

TA貢獻1786條經驗 獲得超13個贊
fmt.Print*(...)函數是 的包裝器。如果你想讓兩個 goroutine 寫給不同的作者,代碼中的第一步是提供他們應該使用的作家:fmt.Fprint*(os.Stdout, ...)
t1 := func(wg *sync.WaitGroup, out io.Writer) {
for i := 0; i < 100; i++ {
time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))
fmt.Fprintln(out, "T1 : ", i)
}
wg.Done()
}
...
// for starters : keep using the same os.Stdout writer
go t1(wg, os.Stdout)
而不是原始的 ,您可能希望傳遞可以記錄的內容;標準庫具有以下結構:io.Writerlog.Logger
t1 := func(wg *sync.WaitGroup, l *log.Logger) {
for i := 0; i < 100; i++ {
time.Sleep(time.Microsecond * time.Duration(r1.Intn(100)))
l.Println(i)
}
wg.Done()
}
...
// all logging libraries will allow you to specify some option which you can tune :
l1 := log.New(os.Stdout, "T1 : ", log.Ltime) // will prefix all messages with "[time] T1 : "
go t1(wg, l1)
// this allows you to write :
l2 := log.New(os.Stdout, "T2 : ", log.Ltime) // will prefix all messages with "[time] T2 : "
go t2(wg, l2)
你可以查看golang日志記錄庫以獲取更多功能 - 但是,不要花太多時間為快速一次性項目選擇日志記錄框架。
現在您已經有了一個明確的方式將兩個不同的寫入器(或記錄器)傳遞給您的 goroutines,請選擇適合您需要寫入的任何內容:
有 goroutine 1 log 到 Stdout,goroutine 2 log 到 Stderr
登錄到 和 -- 只需在某個單獨的終端中運行即可獲得輸出的“實時視圖”
file1
file2
tail -f file2
io.Discard
是一個內置的 golang,相當于/dev/null
登錄到命名管道,unix套接字,tcp連接...
- 2 回答
- 0 關注
- 69 瀏覽
添加回答
舉報