2013-10-24 5 views

답변

8

세 가지 옵션이 있습니다.

  1. cgo를 사용하는 다른 라이브러리를 사용해보십시오. 나는 두 개의 here을 본다.
  2. 직접 cgo를 사용하거나 자신의 lib를 만드십시오.
  3. xz 실행 파일을 사용하십시오.

옵션 3은 소리보다 쉽습니다. 여기 내가 사용하는 것이 무엇 : 여기

func xzReader(r io.Reader) io.ReadCloser { 
    rpipe, wpipe := io.Pipe() 

    cmd := exec.Command("xz", "--decompress", "--stdout") 
    cmd.Stdin = r 
    cmd.Stdout = wpipe 

    go func() { 
     err := cmd.Run() 
     wpipe.CloseWithError(err) 
    }() 

    return rpipe 
} 

의 Runnable 코드 : http://play.golang.org/p/SrgZiKdv9a

+0

고마워, 나는 어떻게 든 godoc.org와이 놀랄만큼 간단한 파이핑을 놓쳤다. – phihag

+1

옵션 3 솔루션은 일반적으로 다양한 쉘 명령을 Go 프로그램에 통합하는 데 유용합니다. –

2

나는 최근에 XZ 압축 해제 패키지를 만들었습니다. Cgo는 필요하지 않습니다. 당신은 여기에서 찾을 수 있습니다

https://xi2.org/x/xz

표준 출력에 표준 입력을 압축 해제 프로그램 :이 라이브러리는`xz` 아카이브에서 사용하는 LZMA2를 LZMA를 지원하지 같은데요

package main 

import (
    "io" 
    "log" 
    "os" 

    "xi2.org/x/xz" 
) 

func main() { 
    r, err := xz.NewReader(os.Stdin, 0) 
    if err != nil { 
     log.Fatal(err) 
    } 
    _, err = io.Copy(os.Stdout, r) 
    if err != nil { 
     log.Fatal(err) 
    } 
}