Tôi không đề xuất điều này, nhưng bạn có thể đạt được điều này bằng cách thay đổi os.Stdout
. Vì biến này thuộc loại os.File
, đầu ra tạm thời của bạn cũng phải là tệp.
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
)
func print() {
fmt.Println("output")
}
func main() {
// setting stdout to a file
fname := filepath.Join(os.TempDir(), "stdout")
fmt.Println("stdout is now set to", fname)
old := os.Stdout // keep backup of the real stdout
temp, _ := os.Create(fname) // create temp file
os.Stdout = temp
print()
// back to normal state
temp.Close()
os.Stdout = old // restoring the real stdout
// reading our temp stdout
fmt.Println("previous output:")
out, _ := ioutil.ReadFile(fname)
fmt.Print(string(out))
}
Tôi không khuyên bạn nên vì đây là quá nhiều hack, và không phải là rất thành ngữ trong Go. Tôi khuyên bạn nên chuyển một số io.Writer
đến các hàm và viết kết quả đầu ra cho điều đó. Đây là cách tốt hơn để làm gần như cùng một điều.
package main
import (
"bytes"
"fmt"
"io"
"os"
)
func print(w io.Writer) {
fmt.Fprintln(w, "output")
}
func main() {
fmt.Println("print with byes.Buffer:")
var b bytes.Buffer
print(&b)
fmt.Print(b.String())
fmt.Println("print with os.Stdout:")
print(os.Stdout)
}
Cái này giống với ví dụ Python hơn. :) –
Bạn thực sự muốn/cần bắt đầu 'io.Copy' * trước * mọi thứ ghi vào đường ống vì có giới hạn về khả năng đệm của đường ống. Di chuyển bắt đầu goroutine là tầm thường và hoàn toàn bỏ qua vấn đề. Ví dụ: http://play.golang.org/p/PNqa5M8zo7 –
Cũng đừng bỏ qua lỗi từ 'os.Pipe' và có thể sử dụng' defer' để khôi phục 'os.Stdout' để bất kỳ mã được thêm nào có thể thoát chức năng không cần phải lo lắng về nó. Và điều này là rất không an toàn để sử dụng đồng thời. –