Building Awesome CLI apps in Go

of 414/414

Click here to load reader

  • date post

    17-Feb-2017
  • Category

    Technology

  • view

    1.455
  • download

    0

Embed Size (px)

Transcript of Building Awesome CLI apps in Go

  • BUILDING AN AWESOME CLI APP IN GO

    1

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 2

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ASHLEY MAC

    Dev Advocate at Rackspace

    Go newbie

    Slightly sarcastic3

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Ashley Mac

    I have no idea what im doing

    4

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • SPF13

    Willfully Unemployed

    Builds Cool Things With Go AKA Gopher

    Irritatingly Specific5

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Steve

    I Kinda Know What I'm Doing

    6

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MAKE SURE YOU HAVE GO INSTALLED

    AND WORKING + AN EDITOR

    7

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • UX OF CLI

    8

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • HUMAN INTERFACE GUIDELINES

    FOR CLIS9

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • UNIx PHILOSOPHY

    10

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • KEN'S "UNIx PHILOSOPHY"11

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • UNIx PHILOSOPHY

    Simple

    Clear

    Composable

    Extensible

    Modular

    Small12

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Rob Pike

    Many UNIX programs do quite trivial things in isolation, but, combined with other programs, become general and

    useful tools. 13

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Doug McIlroy

    The manual page, which really used to be a manual page, is now a small volume,

    with a thousand options 14

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • POSIx + GNU

    15

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • COMMANDS

    16

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • WHAT ARE COMMANDS

    ?17

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls

    c:\dir

    COMMANDS

    18

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls

    cp

    cat

    cd

    list

    copy

    concatenate

    change directory

    ABBREVIATED

    19

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls

    cp

    cat

    cd

    SHORT

    20

    Short

    Clear&

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • lsCONTExT

    21

    operates in current Directory

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • THE LANGUAGE OF COMMANDS

    22

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • lsHAS A LANGUAGE

    23

    List the contentsof the directory I'm in

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls

    rm

    zip

    find

    COMMANDS

    24

    Verbs

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • c:\dir

    COMMANDS

    25

    Noun?

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ARGS26

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • WHAT ARE ARGS?

    27

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • rm [file]

    cp [file] [newfile]

    c:\copy [file] [newfile]

    INPUT

    28

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > rm [file] ... [fileN]

    MANY INPUTS

    29

    Arg0 Argn

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > cp [file] [newfile]

    ORDER MATTERS

    30

    From To

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > cp [file] [newfile]

    SEPARATED

    31

    Space separates

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • THE LANGUAGE OF ARGS

    32

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > cp [file] [newfile]

    DIRECT OBJECT

    33

    Verb Noun Noun

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > cp [file] [newfile]

    IS PROUNCABLE

    34

    Copy this file to here

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • OPTIONS35

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • FLAGS36

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • rm [options] [file]

    c:\del [options] [file]

    MODIFY ACTIONS

    37

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • rm -f badfile.txt

    SEPARATORS

    38

    Space separates

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • rm --force

    PREFIxED

    39

    prefix

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • rm -f

    PREFIxED

    40

    prefix

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • c:\ del /F

    PREFIxED

    41

    prefix

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • -f == --force

    SHORT VS LONG

    42

    Common Options shortened

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • rm -r -f rm -rf

    STACKABLE

    43

    Short options stack

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • THE LANGUAGE OF FLAGS

    44

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • rm --force [file]

    ADVERB

    45

    Verb Adverb Noun

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • rm --force [file]

    PRONOUNCEABLE

    46

    Forcefully remove this file

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • rm --force [file]

    PRONOUNCEABLE

    47

    remove this file with Force

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls --color /home/spf13

    FLAG INPUT

    48

    Verb Adverb Noun

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls --color /home/spf13

    PRONOUNCEABLE

    49

    Colorfully list my home directory

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls -a

    MODIFY BEHAVIOR

    50

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls -a

    MODIFY BEHAVIOR

    51

    List all the things

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ALL ISN'T AN ADVERB

    52

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ADVERBS ExPRESSmanner

    place

    time

    frequency

    degree

    level of certainty

    etc.53

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ADVERBS ANSWERHow? In what way?

    When?

    Where? To what extent?

    54

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls -a

    MODIFY BEHAVIOR

    55

    List completely

    to what extent?

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls --width=40

    IMPUTABLE

    56

    Input

    to what extent?

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls --width 40

    IMPUTABLE

    57

    Input

    to what extent?

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls --width 40

    PREPOSITION

    58

    Verb Preposition Obj

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls --width 40

    PRONOUNCEABLE

    59

    list the directory with a width of 40 cols

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • PREP PHRASE = ADVERBconsists of a preposition and its

    object

    acts as an adverb

    "Speaking at OSCON"60

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • BAD FLAG DESIGN

    61

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • FLAGS AS ACTIONS

    62

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tar -xcvf

    FLAG = ACTION

    63

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tar

    First option must be a mode specifier:

    -c Create -r Add/Replace -t List -u Update -x Extract

    FLAG = ACTION

    64

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • zip

    unzip

    BETTER

    65

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • FLAGS WITH FLAGS

    66

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Extract: tar -x [options]

    -k Keep existing files

    -m Don't restore mod times

    FLAGS HAVING SUB FLAGS

    67

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Create: tar -c [options]

    -z, -j, -J, --lzma Compress archive with gzip/bzip2/xz/lzma

    FLAGS HAVING SUB FLAGS

    68

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • INCOMPATIBLE FLAGS

    69

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls [options]

    -S sort by file size

    -t sort by modification time

    -U do not sort

    ...

    INCOMPATIBLE FLAGS

    70

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ls -StU INCOMPATIBLE FLAGS

    71

    What should this do?

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > ls

    --sort=[size,modtime,none]

    BETTER

    72

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • DOUBLE FLAGS

    73

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • git pull --stat --no-stat FLAG --NO-FLAG

    74

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • git pull --stat

    git pull --stat=false

    BETTER

    75

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • CLI APPS76

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • httpd

    vi

    emacs

    git

    CLI APPS

    77

    Noun

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • APPS

    Launch something

    Do more than one thing

    Collection of commands78

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • SUB COMMANDS

    79

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • svn add

    brew install

    npm search

    apt-get upgrade

    git clone

    SUB COMMANDS

    80

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • SUB COMMANDSCLI apps do multiple things

    Apps are groups of commands

    (sub) Commands have flags & args

    All rules still apply81

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • brew fetch -v hugo

    ExPANDED RESOURCES

    82

    Cmd ArgApp Flag

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • brew install hugo

    NOUN

    83

    Verb ObjectNoun

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • brew install hugo

    PRONOUNCABLE

    84

    Brew, install hugo

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • brew fetch -v hugo

    PRONOUNCABLE

    85

    Verb ObjectNoun adVerb

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • brew fetch -v hugo

    PRONOUNCABLE

    86

    Brew, verbosely fetch hugo

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • GO INTRODUCTION

    87

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MY ExPERIENCE

    88

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • GOPATH AND SETUPYou WILL store your code in a GitHub

    user folder (example: $GOPATH/src/github.com/username/helloworld)

    This was a pain in the ass

    I was comfortable with /code /dev/ or /projects 89

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://github.com/username/helloworld

  • GOPATH AND SETUP

    By Storing code on github, I was able to share my many problems

    Going from Im working on this to lets collaborate

    90

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • GOPATHThe Go toolset uses an environment variable

    called GOPATH to find Go source code.

    You can set GOPATH to anything you want, but things will be easier if its set in your home directory.

    91

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Windows:

    c:\ setx GOPATH %USERPROFILE%

    OS X:

    echo 'export GOPATH=$HOME\n' >> ~/.bash_profile

    Close the terminal, reopen it, and type the following:

    echo $GOPATH

    GO PATH

    92

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • GOPATH AND SETUP

    Typing go get github.com/user/project will download and build a project.

    93

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://github.com/user/project

  • EDITORSNo IDE needed - any text editor will do.

    helpful features like autocomplete and format & import on-save

    If youre not sure what to use, I recommend Atom Its free, cross-platform, and easy to install. 94

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • PLUGINSAtom: https://github.com/joefitzgerald/go-plus

    Vim: https://github.com/fatih/vim-go

    included in http://vim.spf13.com/

    IntelliJ: https://plugins.jetbrains.com/plugin/?id=5047

    Full list: https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins 95

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttps://github.com/joefitzgerald/go-plushttps://github.com/fatih/vim-gohttp://vim.spf13.com/https://plugins.jetbrains.com/plugin/?id=5047https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins

  • YOU DONT NEED A FRAMEWORK!

    The standard library has tons!

    Web server

    Templates

    Database

    etc.. 96

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • YOU DONT NEED A FRAMEWORK!

    Many Packages work well together

    Very modular & Composable

    97

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • STANDARD LIBRARYLets be honest, you dont want to write everything from scratch so most programming depends on your ability to interface with existing libraries. i.e. packages. Here are a few core packages you should know about;

    Strings Input/Output (io/ioutil) Errors fmt

    98

    Containers and Sort path/filepath HTTP (net/http) math/rand

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • GO99

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • STATICALLY TYPED

    100

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • STRONGLY TYPED

    101

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • COMPILED102

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MEMORY MANAGED

    103

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • POWERFUL CONCURRENCY

    BAKED IN104

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • OPEN SOURCE

    105

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • CROSS PLATFORM

    106

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • LANGUAGE DESIGN

    107

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 108

    Ken Thompson (B,C, Unix, UTF-8)

    Rob Pike (Unix, UTF-8)

    Robert Griesmier (Hotspot, JVM, V8)

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MAJOR INFLUENCES

    C & derivatives

    Pascal & derivatives

    CSP109

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • IDEALS

    Expressibility Edibility Powerful

    Simple Scalable

    110

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • SPEC

    Java Spec : 670 pages

    YAML Spec : 84 pages

    Go Spec : 82 pages111

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • KEYWORDSbreak default func interface select case defer go 112

    map struct chan else goto package switch const

    fallthrough if range type continue for import return var

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • BRACES

    113

    Fail

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • BRACES

    Compile Eror

    114

    Compile Error

    /tmp/sandbox826898458/main.go:6: syntax error: unexpected semicolon or newline before {

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • BRACES

    What works

    115

    Works

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • VARIABLES

    116

    Fail

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • VARIABLES

    117

    Error

    /tmp/sandbox473116179/main.go:6: one declared and not used /tmp/sandbox473116179/main.go:7: two declared and not used /tmp/sandbox473116179/main.go:8: three declared and not used

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • WHAT GO DOESNT HAVE

    118

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • CLASSES ( * SHOCKED

    EXPRESSION *)119

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • OBJECTS120

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • COMPLExITY

    121

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • TYPES122

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • SINGLE VALUE TYPES

    123

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • NUMBERS

    Integers (numbers without a decimal)

    Floating-Point Numbers (numbers that contain a decimal)

    int, int8-64, uint, uint8-64, float32,64124

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • STRINGSA string is a sequence of

    characters

    Go strings are immutable

    Go strings are made up of individual bytes (Usually one for each character)

    125

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MULTI VALUE TYPES

    126

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • type person struct { name string age int }

    STRUCT

    127

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ARRAY

    An array is an ordered sequence of elements of a single type

    Fixed length

    Arrays are indexed starting from 0128

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • SLICE

    Segment of an array

    Dynamic length

    Can be used without thinking about array underneath

    129

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MAPUnordered collection of key-value

    pairs

    Similar to associative arrays, hash tables, and dictionaries

    Dynamic Length130

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • SOME OTHER TYPES

    131

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • FUNCTIONFunction is a type

    First class citizen in Go

    Can have multiple input values

    Can have multiple return values132

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • POINTERSReference a location in memory

    where a value is stored

    Represented using '*'

    Memory location referenced using '&'133

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • DEFINE YOUR OWN TYPES

    Composed of other types

    Not aliases

    134

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • METHOD

    Function defined on a type

    135

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • TOOLING136

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • GO HELPThe Go toolset has many different commands and subcommands. You can pull up a list by typing:

    go help

    You now have everything you need to get started

    137

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • GO FMT

    Formats your go code for you

    Awesome to do "on save"

    End of all stylistic debates138

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • GO TESTWriting code isnt easy and humans make mistakes so testing is really important, luckily, Go includes a program that makes writing tests easier:

    go test

    Fun Fact: The Go compiler knows to ignore code in files ending with _test.go

    139

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • CLOSING THOUGHTS

    140

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • I THINK GO IS AWESOME

    141

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • IT HAS STRONG OPINIONS

    142

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • COMPILATION IS VERY FAST (USUALLY A

    SECOND OR TWO)143

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • AWESOME COMMUNITY

    144

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • RESOURCESGetting Started, official golang pagehttps://golang.org/doc/ Parses move from Ruby to Golanghttp://blog.parse.com/learn/how-we-moved-our-api-from-ruby-to-go-and-saved-our-sanity/

    TutorialCreating a Wikihttps://golang.org/doc/articles/wiki/ (this was the first big tutorial that got me to build something useful, take this one slow to get a grasps on its concepts)

    GolangConcurrency is not Parallelism (Rob Pike), this video I found super informative about gos concurency and got me excited to keep coding in Golanghttps://youtu.be/cN_DpYBzKso

    145

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttps://youtu.be/cN_DpYBzKso

  • LET'S BUILD AN APP

    146

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 147

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • HTTP://WWW.SLIDESHARE.NET/SPF13

    148

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://www.slideshare.net/spf13

  • HTTPS://GITHUB.COM/SPF13/TRI

    149

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttps://github.com/spf13/tri

  • 1. DESIGNING OUR APP

    150

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • WHAT'S IN A NAME?

    151

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • SHOCKING AMOUNT OF TODO APPS

    152

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • LET'S MAKE A BUNCH MORE

    153

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • I'M CALLING MINE "TRI"

    154

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • FEATURES155

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • FEATURESAdd Todo

    List Todos

    Mark "done"

    Search/Filter

    Priorities

    Archive

    Edit

    Create Dates

    Due Dates

    Tags

    Projects

    156

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • INTERFACE DESIGN

    157

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ADDING158

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri add "Add Priorities"ADD

    159

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri add Add PrioritiesADD

    160

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri add "Add Priorities"

    ADD

    161

    Verb ObjectNoun

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri add \ "Add Multi Todo Support" \ "Consider usage behaviors"

    ADD

    162

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • PRIORITY163

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri add -p1 "Add listing"

    ADD WITH PRIORITY

    164

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri add -p1 "Add listing"

    ADD WITH PRIORITY

    165

    Verb ObjectNoun adVerb

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri add -p1 "Add listing"

    PRONOUNCEABLE

    166

    Tri, add "Add listing" Todo with a pri of 1

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri add "Add listing P:1"

    ALTERNATE SYNTAx

    167

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • CONSIDERATIONSWhat priority system to use?

    Numeric

    Alpha

    High, Middle, Low

    What's the default priority? 168

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MY TODO

    High, Middle, Low

    H=1, L=3, M/_=2

    Default is 2169

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • LISTING170

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri ls

    LISTING

    171

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list

    LISTING

    172

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri

    LISTING

    173

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list

    (1) Add Listing

    Consider usage behaviors

    Add Multi Todo Support

    Add Priorities

    LISTING OUTPUT

    174

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list

    (1) Add Listing

    Add Priorities

    Add Multi Todo Support

    Consider usage behaviors

    LISTING OUTPUT

    175

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list

    (H) Add Listing

    Consider usage behaviors

    Add Priorities

    (L) Add Multi Todo Support

    LISTING OUTPUT

    176

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list

    (H) Add Listing

    Consider usage behaviors

    Add Priorities

    (L) Add Multi Todo Support

    LISTING OUTPUT

    177

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list

    1. (H) Add Listing

    2. Consider usage behaviors

    3. Add Priorities

    4. (L) Add Multi Todo Support

    LISTING OUTPUT

    178

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • FILTERING179

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list done

    TOKENS

    180

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list -p1

    FLAGS

    181

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list -p1

    tri list --due June

    tri list --created 12/15

    tri list --done -p1

    FILTER BY PROPERTY

    182

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list -p2

    2. Consider usage behaviors

    3. Add Priorities

    FILTER BY PRIORITY

    183

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list "Add"

    1. (H) Add Listing

    3. Add Priorities

    4. (L) Add Multi Todo Support

    SEARCHING

    184

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list "Add" "Pri"

    3. Add Priorities

    SEARCHING

    185

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • UPDATING186

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri list

    1. (H) Add Listing

    2. Consider usage behaviors

    3. Add Priorities

    4. (L) Add Multi Todo Support

    LISTING OUTPUT

    187

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri done 2

    COMPLETING

    188

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri edit 1 "Improve Listing"

    EDITING

    189

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri edit 1 -p2

    tri edit 2 --due 05/13/15

    tri edit 3 --created 12/15

    EDITING

    190

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri edit 1 -p2

    tri list -p2

    tri edit 3 --created 12/15

    tri list --created 12/15

    CONSISTENCY

    191

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tri edit 1 2 3 -p2

    BATCH EDIT?

    192

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 2. CREATING A PROJECT

    193

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • COBRA194

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • A CLI Command Framework

    A tool to generate CLI apps & commands

    Powers Kubernetes, Dropbox, Git Lfs, CoreOS, Docker, Delve ...

    195

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • go get -u \

    github.com/spf13/cobra/cobra

    GET & INSTALL COBRA

    196

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • cobra

    Cobra is a Cli library for Go that empowers applications. This application is a tool to generate the needed files to quickly create a Cobra application.

    Usage:

    cobra [command]

    Available Commands:

    add Add a command to a Cobra Application

    COBRA

    197

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • COBRA APP

    BUILDER198

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • cobra init \ github.com//tri \

    -a ""

    COBRA INIT

    199

    Replace with your url, project name & Name

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • cobra init ...

    Your Cobra application is ready at

    /Users/spf13/gopath/src/github.com/spf13/tri

    COBRA

    200

    http://github.com/spf13/trihttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • cd $GOPATH/src/github.com//tri

    CD TO PROJECT

    201

    Replace with your url, project name & Name

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • tree

    .

    LICENSE

    cmd

    root.go

    main.go

    LOOK AT YOUR PROJECT

    202

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • go build

    ./tri

    A longer description that spans multiple lines and likely contains examples

    and usage of using your application. For example...

    BUILD & RUN IT

    203

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • YOU'VE JUST CREATED YOUR

    1ST GO APP204

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • IT'S ALL UPHILL FROM

    HERE205

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • LET'S WRITE SOME CODE

    206

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • OPEN THE PROJECT IN AN EDITOR

    207

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 208

    LiteIDE

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 209

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • HTTPS://SOURCEFORGE.NET/PROJECTS/LITEIDE/FILES/X29/ 210

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttps://sourceforge.net/projects/liteide/files/X29/

  • WORKING WITH THE

    ROOT211

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • package cmdimport ( "fmt" "os" "github.com/spf13/cobra" "github.com/spf13/viper")

    CMD/ROOT.GO

    212

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • package cmdimport ( "fmt" "os" "github.com/spf13/cobra" "github.com/spf13/viper")

    CMD/ROOT.GO

    213

    Notice package name

    Matches Dir

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • // This represents the base command when called without any subcommandsvar RootCmd = &cobra.Command{ Use: "tri", Short: "A brief description of your application", Long: `A longer description that spans multiple lines and likely ... application.`,}

    CMD/ROOT.GO

    214

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • // This represents the base command when called without any subcommandsvar RootCmd = &cobra.Command{ Use: "tri", Short: "Tri is a todo application", Long: `Tri will help you get more done in less time.It's designed to be as simple as possible to help you accomplish your goals.`,

    }

    CMD/ROOT.GO

    215

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • var RootCmd = &cobra.Command{ Use: "tri",...

    CMD/ROOT.GO

    216

    Package level variable & Exported

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MAIN217

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MAIN MAIN MAINGo programs are all about "main"

    main.go (convention)

    main package

    main()218

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • package main import "github.com//tri/cmd" func main() { cmd.Execute()}

    MAIN.GO

    219

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • package main import "github.com//tri/cmd"func main() { cmd.Execute()}

    MAIN.GO

    220

    Package Name

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • package main import "github.com//tri/cmd" func main() { cmd.Execute()}

    MAIN.GO

    221

    Function Name

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func Execute() { if err := RootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(-1) }}

    CMD/ROOT.GO

    222

    Package level variable

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • >go run main.go

    Tri will help you get more done in less time.

    It's designed to be as simple as possible to help you accomplish your goals.

    RUN IT

    223

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 3. CREATING OUR ADD COMMAND

    224

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ADD "ADD"

    225

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > cd $GOPATH/src/github.com/spf13/tri

    CD TO PROJECT

    226

    Replace with your url, project name & Name

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > cobra add add

    add created at $GOPATH/src/github.com/spf13/tri/cmd/add.go

    COBRA ADD ADD

    227

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > go run main.go add

    add called

    RUN "ADD"

    228

    Bill wants me to replace go run with

    go build

    ./tri

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • MAKE "ADD" ADD

    229

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • package cmdCMD/ADD.GO

    230

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • var addCmd = &cobra.Command{ Use: "add", Short: "A brief description of your command", Long: `A longer description that spans multiple lines and likely...`, Run: func(cmd *cobra.Command, args []string) { // TODO: Work your own magic here fmt.Println("add called") },}

    CMD/ADD.GO

    231

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • var addCmd = &cobra.Command{ Use: "add", Short: "Add a new todo", Long: `Add will create a new todo item to the list`, Run: func(cmd *cobra.Command, args []string) { // TODO: Work your own magic here fmt.Println("add called") },}

    CMD/ADD.GO

    232

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(cmd *cobra.Command, args []string){

    fmt.Println("add called")

    }

    CMD/ADD.GO

    233

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • var addCmd = &cobra.Command{ Use: "add", Short: "Add a new todo", Long: `Add will create a new todo item to the list`, Run: addRun,}

    CMD/ADD.GO

    234

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(cmd *cobra.Command, args []string) { for _, x := range args { fmt.Println(x) }}

    CMD/ADD.GO

    235

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • FOR x, Y := RANGEProvides a way to iterate over an array,

    slice, string, map, or channel.

    Like Foreach or Each in other languages

    x is index/key, y is value

    _ allows you to ignore naming variables236

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func init() { RootCmd.AddCommand(addCmd)}

    CMD/ADD.GO

    237

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • INIT()Special function

    Called after package variable declarations

    Called prior to main.main()

    Each package may have multiple init()

    init() order un-guaranteed238

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • > go run main.go add \

    "one two" three

    one two

    three

    RUNNING ADD

    239

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 4. CREATING OUR DATA

    MODEL240

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • CREATE A NEW

    PACKAGE241

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 242

    New Folder New File

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • package todo type Item struct { Text string }

    TODO/TODO.GO

    243

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • NAMED TYPESCan be any known type (struct,

    string, int, slice, a new type youve declared, etc)

    Methods can be declared on it

    Not an alias - Explicit type244

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • USING OUR NEW TYPE

    245

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • import ( "fmt" "github.com/spf13/cobra" "github.com//tri/todo")

    CMD/ADD.GO

    246

    Replace with yourS

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(...) { items := []todo.Item{} for _, x := range args { items = append(items, todo.Item{Text:x}) } fmt.Println(items)}

    CMD/ADD.GO

    247

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(...) { items := []todo.Item{} for _, x := range args { items = append(items, todo.Item{Text:x}) } fmt.Println(items)}

    CMD/ADD.GO

    248

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • APPEND

    Append adds new values to a slice

    Append will grow a slice as needed

    249

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(...) { items := []todo.Item{} for _, x := range args { items = append(items, todo.Item{Text:x}) } fmt.Println(items)}

    CMD/ADD.GO

    250

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(...) { items := []todo.Item{} for _, x := range args { items = append(items, todo.Item{Text:x}) } fmt.Println(items)}

    CMD/ADD.GO

    251

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • >go run main.go add \ "one two" three

    [{one two} {three}]

    GO RUN

    252

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(...) { var items = []todo.Item{} for _,x := range args { items = append(items, todo.Item{Text:x}) } fmt.Printf("%#v\n", items)}

    CMD/ADD.GO

    253

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • >go run main.go add \ "one two" three

    []todo.Item{todo.Item{Text:"one two"}, todo.Item{Text:"three"}}

    GO RUN

    254

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • 5. PERSISTING OUR DATA

    255

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • SAVING DATA

    256

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func SaveItems(filename string, items []Item) error { return nil }

    TODO/TODO.GO

    257

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • JSON258

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • import ( "encoding/json")

    TODO/TODO.GO

    259

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func SaveItems(filename string, items []Item) error { b, err := json.Marshal(items) if err != nil { return err } fmt.Println(string(b)) return nil}

    TODO/TODO.GO

    260

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func SaveItems(filename string, items []Item) error { b, err := json.Marshal(items) if err != nil { return err } fmt.Println(string(b)) return nil}

    TODO/TODO.GO

    261

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func SaveItems(filename string, items []Item) error { b, err := json.Marshal(items) if err != nil { return err } fmt.Println(string(b)) return nil}

    TODO/TODO.GO

    262

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ERROR HANDLINGErrors are not exceptional, they

    are just values

    No exceptions in Go

    Errors should be handled when they occur

    263

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • ( DONT) PANICOnly use when:

    1. You want to shut down your program AND

    2. You need a stack trace

    Packages should never call Panic (only applications)

    Do not use as pseudo-exception handling

    Only recover a panic if you know you can properly recover from it 264

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func SaveItems(filename string, items []Item) error { b, err := json.Marshal(items) if err != nil { return err } fmt.Println(string(b)) return nil}

    TODO/TODO.GO

    265

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(cmd *cobra.Command, args []string) { var items = []todo.Item{} for _, x := range args { items = append(items, todo.Item{Text: x}) } todo.SaveItems("x", items)}

    CMD/ADD.GO

    266

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • >go run main.go add \

    "one two" three

    [{"Text":"one two"},{"Text":"three"}]

    CHECK JSON CREATION

    267

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • WRITING TO FILES

    268

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • import ( "io/ioutil" "encoding/json")

    TODO/TODO.GO

    269

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func SaveItems(filename string, items []Item) error {... err = ioutil.WriteFile(filename, b, 0644) if err != nil { return err } return nil}

    TODO/TODO.GO

    270

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(cmd *cobra.Command, args []string) { var items = []todo.Item{} for _, x := range args { items = append(items, todo.Item{Text: x}) }

    err := todo.SaveItems("/Users/spf13/.tridos.json", items); if err != nil { fmt.Errorf("%v", err) }}

    CMD/ADD.GO

    271

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • go run main.go add "one two" three

    cat ~/.tridos.json

    [{"Text":"one two"},{"Text":"three"}]

    CHECK FILE CREATION

    272

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • READING DATA

    273

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func ReadItems(filename string) ([]Item, error) { return []Item{}, nil}

    TODO/TODO.GO

    274

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func ReadItems(filename string) ([]Item, error) { return []Item{}, nil}

    TODO/TODO.GO

    275

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func ReadItems(filename string) ([]Item, error) { b, err := ioutil.ReadFile(filename) if err != nil { return []Item{}, err }

    ...

    TODO/TODO.GO

    276

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func ReadItems(filename string) ([]Item, error) { b, err := ioutil.ReadFile(filename) if err != nil { return []Item{}, err }

    ...

    TODO/TODO.GO

    277

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func ReadItems(filename string) ([]Item, error) {

    ...var items []Itemif err := json.Unmarshal(b, &items); err != nil { return []Item{}, err}return items, nil

    }

    TODO/TODO.GO

    278

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func ReadItems(filename string) ([]Item, error) {

    ...var items []Itemif err := json.Unmarshal(b, &items); err != nil { return []Item{}, err}return items, nil

    }

    TODO/TODO.GO

    279

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func ReadItems(filename string) ([]Item, error) {

    ...var items []Itemif err := json.Unmarshal(b, &items); err != nil { return []Item{}, err}return items, nil

    }

    TODO/TODO.GO

    280

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func ReadItems(filename string) ([]Item, error) {

    ...var items []Itemif err := json.Unmarshal(b, &items); err != nil { return []Item{}, err}return items, nil

    }

    TODO/TODO.GO

    281

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func ReadItems(filename string) ([]Item, error) {

    ...var items []Itemif err := json.Unmarshal(b, &items); err != nil { return []Item{}, err}return items, nil

    }

    TODO/TODO.GO

    282

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • LIST COMMAND

    283

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • cobra add list

    list created at $GOPATH/src/github.com/spf13/tri/cmd/list.go

    ADD LIST COMMAND

    284

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Run: func(cmd *cobra.Command, args []string) { items, err := todo.ReadItems("/Users/spf13/.tridos.json")

    if err != nil { log.Printf("%v", err) } fmt.Println(items)},

    CMD/LIST.GO

    285

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Run: func(cmd *cobra.Command, args []string) { items, err := todo.ReadItems("/Users/spf13/.tridos.json")

    if err != nil { log.Printf("%v", err) } fmt.Println(items)},

    CMD/LIST.GO

    286

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • Run: func(cmd *cobra.Command, args []string) { items, err := todo.ReadItems("/Users/spf13/.tridos.json")

    if err != nil { log.Printf("%v", err) } fmt.Println(items)},

    CMD/LIST.GO

    287

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • go run main.go list

    [{one two} {three}]

    RUN LIST

    288

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(cmd *cobra.Command, args []string) { var items = []todo.Item{}

    for _, x := range args { items = append(items, todo.Item{Text: x}) }

    ...

    CMD/ADD.GO

    289

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.com

  • func addRun(cmd *cobra.Command, args []string) { items, err := todo.ReadItems("/Users/spf13/.tridos.json") if err != nil { log.Printf("%v", err) }

    for _, x := range args { items = append(items, todo.Item{Text: x}) }

    ...

    CMD/ADD.GO

    290

    http://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf13.comhttp://spf1