-
Notifications
You must be signed in to change notification settings - Fork 8
Swarna's solutions for Quiz and Url shortener #4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Swarna's solutions for Quiz and Url shortener #4
Conversation
key := entry["path"] | ||
pathMap[key] = entry["url"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like you could have used a struct instead of a map here. Using a struct would be good practice for using go tags.
return out, err | ||
} | ||
|
||
func buildMap(parsedYaml []map[string]string) map[string]string { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is this going to only accept YAML? The bonus objective is to also be able to use JSON.
path, ok := pathsToUrls[r.URL.Path] | ||
if ok { | ||
http.Redirect(w, r, path, http.StatusFound) | ||
} else { | ||
fallback.ServeHTTP(w, r) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In go you will typically return instead of using else statements where appropriate.
path, ok := pathsToUrls[r.URL.Path] | |
if ok { | |
http.Redirect(w, r, path, http.StatusFound) | |
} else { | |
fallback.ServeHTTP(w, r) | |
} | |
if path, ok := pathsToUrls[r.URL.Path]; ok { | |
http.Redirect(w, r, path, http.StatusFound) | |
} | |
fallback.ServeHTTP(w, r) |
return func(w http.ResponseWriter, r *http.Request) { | ||
path, ok := pathsToUrls[r.URL.Path] | ||
if ok { | ||
http.Redirect(w, r, path, http.StatusFound) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is http.StatusFound
correct? I remember needing to use a 211
or some other status to signify a redirect.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For the status code, I referred the following article https://stackoverflow.com/questions/22887148/is-the-http-statusfound-the-correct-status-for-a-click-redirect
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Checks out
|
||
func parseYAML(yml []byte) (out []map[string]string, err error) { | ||
err = yaml.Unmarshal(yml, &out) | ||
return out, err |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using the named return values in the signature was a clever idea here. When you do that you don't need to specify the variables in the return statement (as long as you are returning the signature values).
return MapHandler(pathMap, fallback), nil | ||
} | ||
|
||
func parseYAML(yml []byte) (out []map[string]string, err error) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure you need this function since it would only be two lines in the YAMLHandler function.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The parseYAML stub was suggested in the problem. That's why I went ahead with it.
// See MapHandler to create a similar http.HandlerFunc via | ||
// a mapping of paths to urls. | ||
func YAMLHandler(yml []byte, fallback http.Handler) (http.HandlerFunc, error) { | ||
// TODO: Implement this... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you still need this TODO
?
// If the path is not provided in the map, then the fallback | ||
// http.Handler will be called instead. | ||
func MapHandler(pathsToUrls map[string]string, fallback http.Handler) http.HandlerFunc { | ||
// TODO: Implement this... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you still need this TODO
?
@gonzogomez I've updated the quiz problem with flags and pointer receivers as you mentioned. |
} | ||
|
||
func (q *Quiz) readProblems() { | ||
csvfile, err := os.Open(q.filename) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should probably make sure you close the file after opening it.
defer csvfile.Close()
for i := 0; i < len(q.problems); i++ { | ||
question, answer := q.problems[i][0], q.problems[i][1] | ||
fmt.Println("What is " + question + " ?") | ||
userAnswer, _ := in.ReadString('\n') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In Go, you'll typically see people iterating through slices using the range clause.
i.e., your code might look something like:
for i := 0; i < len(q.problems); i++ { | |
question, answer := q.problems[i][0], q.problems[i][1] | |
fmt.Println("What is " + question + " ?") | |
userAnswer, _ := in.ReadString('\n') | |
for _, problem := range q.problems { | |
question, answer := problem[0], problem[1] | |
fmt.Printf("What is %s?\n", question) | |
userAnswer, _ := in.ReadString('\n') | |
// Rest of your code here | |
} |
Also note the use of fmt.Printf() instead of fmt.Println(). It's not actually important in this case, given that question is just a string, but I thought I'd make a note just in case you weren't familiar.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh okay. I'll make sure that I follow this in the future.
filename string | ||
timeLimit int | ||
shuffle bool | ||
problems [][]string |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems like a Problem
or Question
struct would be better than a slice of slices.
q.problems = records | ||
} | ||
func (q *Quiz) shuffleProblems() { | ||
rand.Seed(time.Now().UnixNano()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seeding should only happen once and in the main function.
Reviewers : @icubbon @JayDonigian @AdamO-SL @EmilyFOwens @gonzogomez