¿Cómo usar los literales de cadena de escáner personalizados de Golang y expandir la memoria para cargar todo el archivo en la memoria?

He estado tratando de descubrir cómo implementar lo que originalmente pensé que sería un programa simple. Tengo un archivo de texto de citas que están separadas por "$"

Quiero que el programa analice el archivo de cotización y seleccione aleatoriamente 3 comillas para mostrar y salida estándar.

Hay 1022 citas en el archivo.

Cuando intento dividir el archivo, aparece este error: falta '

Parece que no puedo entender cómo asignar $ con un literal de cadena, sigo obteniendo:
desaparecido '

Este es el escáner personalizado:

onDollarSign := func(data []byte, atEOF bool) (advance int, token []byte, err error) {  
    for i := 0; i < len(data); i++ { 
        //if data[i] == "$" {              # this is what I did originally
        //if data[i:i+2] == "$" {    # (mismatched types []byte and string)
        //if data[i:i+2] == `$` {    # throws (mismatched types []byte and string)
        // below throws syntax error: unexpected $ AND missing '
        if data[1:i+2] == '$' {   
            return i + 1, data[:i], nil  
        }  
    }  

El literal de cadena funciona bien si solo uso uno$.

Por alguna razónsolo se cargan 71 citas en el segmento de citas. No estoy seguro de cómo expandirme. Para permitir que todas las cotizaciones 1022 se almacenen en la memoria.

He tenido un momento realmente difícil tratando de descubrir cómo hacer esto. Esto es lo que tengo ahora:

package main
import (  
    "bufio"  
    "fmt"  
    "log"  
    "math/rand"  
    "os"  
    "time"  
)  

func main() {  
    rand.Seed(time.Now().UnixNano()) // Try changing this number!  
    quote_file, err := os.Open("/Users/bryan/Dropbox/quotes_file.txt")  
    if err != nil {  
        log.Fatal(err)  
    }  
    scanner := bufio.NewScanner(quote_file)  
    // define split function  
    onDollarSign := func(data []byte, atEOF bool) (advance int, token []byte, err error) {  
        for i := 0; i < len(data); i++ {  
            if data[i] == '$' {  
                return i + 1, data[:i], nil  
            }  
        }  
        fmt.Print(data)  
        return 0, data, bufio.ErrFinalToken  
    }  
    scanner.Split(onDollarSign)  
    var quotes []string  

    // I think this will scan the file and append all the parsed quotes into quotes  
    for scanner.Scan() {  
        quotes = append(quotes, scanner.Text())  

    }  
    if err := scanner.Err(); err != nil {  
        fmt.Fprintln(os.Stderr, "reading input:", err)  
    }  
    fmt.Print(len(quotes))  
    fmt.Println("quote 1:", quotes[rand.Intn(len(quotes))])  
    fmt.Println("quote 2:", quotes[rand.Intn(len(quotes))])  
    fmt.Println("quote 3:", quotes[rand.Intn(len(quotes))])  
}  

Respuestas a la pregunta(4)

Su respuesta a la pregunta