Just my learning go snippets
/*
Package palindrome is for finding palindromes
*/
package palindrome

import (
	"sync"
)

// Single searches for the longest palindrome in the input string.
// Single thread version
func Single(str string) string {
	if str == "" {
		return ""
	}
	var longest string
	for k := 1; k < len(str)/2+1; k++ {
		var candidate string
		for i := 1; k-i > -1 && k+i < len(str); i++ {
			if str[k-i] == str[k+i] {
				candidate = str[k-i : k+i+1]
			} else {
				break
			}
		}
		if len(candidate) > len(longest) {
			longest = candidate
		}
	}
	return longest
}

// Concurrent returns the longest palindrome in str
// Concurrent version
func Concurrent(str string) string {
	if str == "" {
		return ""
	}
	var longest string
	var wg sync.WaitGroup
	results := make(chan string)
	for k := 1; k < len(str)/2+1; k++ {
		wg.Add(1)
		go func(char string, num int) {
			defer wg.Done()
			results <- palWorker(char, num)
		}(str, k)
	}
	go func() {
		wg.Wait()
		close(results)
	}()
	for candidate := range results {
		if len(candidate) > len(longest) {
			longest = candidate
		}
	}
	return longest
}

func palWorker(str string, k int) string {
	var longest string
	for i := 1; k-i > -1 && k+i < len(str); i++ {
		if str[k-i] == str[k+i] {
			longest = str[k-i : k+i+1]
		} else {
			break
		}
	}
	return longest
}