The function ScanLines splits lines from a io.Reader, it returns a channel where the results are written. Handy when you want to read things on the fly line by line:

// Read input line by line and send it to the returned channel. Once there's
// nothing left to read closes the channel.
func ScanLines(input io.Reader) <-chan string {
        var output = make(chan string)

        go func() {
                var scanner = bufio.NewScanner(input)

                for scanner.Scan() {
                        output <- scanner.Text()

                if err := scanner.Err(); err != nil {
                        fmt.Fprintln(os.Stderr, "reading input:", err)

        return output

func main() {
        var input = ScanLines(os.Stdin)

        for x := range input {
                fmt.Printf("%#v\n", x)