Hi, I'm Ataias Reis

Programmer, made in Brazil, Alma mater University of Brasilia

30 days of code in Go: Day 0 - Reading from stdin

Today I am starting the 30 days of code challenge on Hackerrank. You will be able to see my progress at my profile. The language I chose is Go. I do not have experience in Go and I am pretty excited. I think the challenge is basic, but it will probably be fun, so bear with me. Later on I may take better challenges, when I get more experience with Hackerrank.

Incredibly, this gave me more trouble than I expected. First of all I had to install go using homebrew:

$ brew install go

And then I had to write a program for the first day. The goal was to read a variable from standard input and then print it to the standard output. In C, I would just use scanf but the solution in Go that worked first for me was using a bufio reader:

package main

import (
 "fmt"
 "bufio"
 "os"
)

func main() {
  // create a reader that can be called
  // multiple times
  reader := bufio.NewReader(os.Stdin)
  // reads a variable from stdin
  text, _ := reader.ReadString('\n')
  //prints to stdout
  fmt.Printf("Hello, World.\n")
  fmt.Printf("%s\n", text)
}

I had a problem using fmt.Scanln to read a single input line. Why? Well, I tried this:

package main

import "fmt"

func main() {
 var input string
 fmt.Scanln(&input)
 //prints to stdout
 fmt.Printf("Hello, World.\n")
 fmt.Printf("%s\n", input)
}

For some reason, input here was storing only the first word and everything else was not stored… what gave me troubles with the tests. Then I read the Golang documentation which says Scanln is similar to Scan, but stops scanning at a newline and after the final item there must be a newline or EOF and I didn’t exactly understand what it means to be similar to Scan but when I looked it up it said Scan scans text read from standard input, storing successive space-separated values into successive arguments. Well, this made clear that the Scanln was not what I actually needed. It is also possible to use Scanf:

package main

import "fmt"

func main() {
 var input string
 fmt.Scanf("%q", &input)
 //prints to stdout
 fmt.Printf("Hello, World.\n")
 fmt.Printf("%s\n", input)
}

Then the input to the program and output would be

$ ./day_01
Tudo bem?
Hello, World.
Tudo bem?

That’s all for today, thanks for reading! Do not hesitate to comment!

Tags
comments powered by Disqus