'google golang'에 해당되는 글 3건

  1. 2015.01.19 #20150119-03 :: go :: go를 이용한 TCP/IP Echo Server Example
  2. 2015.01.19 #20150119-02 :: go :: vim에서 go language 사용하기
  3. 2015.01.19 #20150119-01 :: go :: 우분투에서 go language 설치하기

#20150119-03 :: go :: go를 이용한 TCP/IP Echo Server Example

아래는 go를 이용한 간단한 TCP/IP Echo Server 예제 입니다.

관리 용이성을 위해 서버와 클라이언트를 한 코드에 넣었습니다.


package main


import (

  "bufio"

  "fmt"

  "net"

  "os"

  "time"

)


func main() {


  send := make(chan string)

  quit := make(chan string)


  addr, err := net.ResolveTCPAddr("tcp", ":9000")


  ln, err := net.ListenTCP("tcp", addr)

  if err != nil {

    fmt.Println(err.Error())

    return;

  }


  go runServer(ln, quit)


  time.Sleep(time.Duration(1) * time.Second)


  conn, err := net.Dial("tcp", "127.0.0.1:9000")

  if err != nil {

    fmt.Println(err.Error())

    return;

  }


  go runClient(conn, quit)

  go runScan(send, quit)


  stop := false

  for !stop {


    fmt.Println("main loop ...")


    select {

    case text, ok := <- send:

      if !ok {

        ln.Close()

        conn.Close()

        stop = true

      }

      conn.Write([]byte(text))

    case err := <- quit:

      fmt.Println(err)

      stop = true

    }

  }


  fmt.Println("complete.")

}


func runScan(send chan string, quit chan string) {


  fmt.Println("runScan begin.")


  scanner := bufio.NewScanner(os.Stdin)

  for scanner.Scan() {

    text := scanner.Text()

    if text == "." {

      close(send)

      break

    }


    send <- text

  }

  

  fmt.Println("runScan end.")

}


func runServer(ln *net.TCPListener, quit chan string) {


  fmt.Println("runServer begin.")


  for {

    conn, err := ln.Accept()

    if err != nil {

      quit <- err.Error()

      break

    }


    go runSession(conn, quit)

  }


  fmt.Println("runServer end.")

}


func runSession(conn net.Conn, quit chan string) {


  fmt.Println("runSession begin.")


  buf := make([]byte, 1024)


  for {

    size, err := conn.Read(buf)

    if err != nil || size == 0 {

      quit <- err.Error()

      break

    }


    _, err = conn.Write(buf[:size])

    if err != nil {

      quit <- err.Error()

      break

    }

  }


  fmt.Println("runSession end.")

}


func runClient(conn net.Conn, quit chan string) {


  fmt.Println("runClient begin.")


  buf := make([]byte, 1024)


  for {

    size, err := conn.Read(buf)

    if err != nil {

      quit <- err.Error()

      break

    }


    fmt.Println(string(buf[:size]))

  }


  fmt.Println("runClient end.")

}


#20150119-02 :: go :: vim에서 go language 사용하기




pathogen 설치한다. 이 때, curl이 필요하여 설치하여 주었다.


$ cd ~/.vim

$ mkdir -p autoload bundle

$ sudo apt-get install curl

$ cd autoload

$ curl -LSso pathogen.vim https://tpo.pe/pathogen.vim


.vimrc 파일을 만든다.


$ cd ~/

$ vi .vimrc

execute pathogen#infect()
syntax on
filetype plugin indent on


vim-go를 설치한다.


$ cd /work/apps/golang

$ git clone https://github.com/fatih/vim-go.git

$ cd ~/.vim/bundle

$ ln -s /work/apps/golang/vim-go vim-go


mercurial을 설치한다.


$ sudo apt-get install mercurial


vim을 실행한 후 GoInstallBinaries를 실행한다.


$ vi

: GoInstallBinaries


자동 완성을 위해 YCM을 설치한다. YCM을 위해서는 python-dev와 cmake가 필요하다.


$ sudo apt-get install python-dev cmake

$ cd /work/apps/vim

$ git clone https://github.com/Valloric/YouCompleteMe.git

$ cd ~/.vim/bundle

$ ln -s /work/apps/vim/YouCompleteMe YouCompleteMe

$ cd YouCompleteMe

$ git submodule update --init --recursive

$ sudo apt-get install build-essential

$ pushd /work/apps/vim/YouCompleteMe YouCompleteMe

$ ./install.sh

$ popd


Tagbar를 설치한다. ctag가 필요하다. 설치 후 단축키 F8에 매핑한다.


$ sudo apt-get install ctags

$ cd /work/apps/vim

$ git clone https://github.com/majutsushi/tagbar.git

$ cd ~/.vim/bundle

$ ln -s /work/apps/vim/tagbar tagbar

$ vi ~/.vimrc

nmap <F8> :TagbarToggle<CR>


파일 브라우저 nerdtree를 설치한다.


$ cd /work/apps/vim

$ git clone https://github.com/scrooloose/nerdtree.git

$ cd ~/.vim/bundle

$ ln -s /work/apps/vim/nerdtree nerdtree

$ vi ~/.vimrc

nmap <C-n> :NERDTreeToggle<CR>


모두 설치하고 vi를 실행시키면 아래와 같은 에러가 발생한다.

YouCompleteMe unavailable: requires Vim 7.3.584+

vi는 정상 동작을 하지만, YCM은 사용할 수 없다.

그래서 vim을 강제로 판올림 해줘야 한다.


$ sudo add-apt-repository ppa:nmi/vim-snapshots

$ sudo apt-get update; sudo apt-get install vim


vi를 원래 버전으로 되돌리려면 아래와 같은 명령을 사용한다.


$ sudo apt-get install ppa-purge; sudo ppa-purge ppa:nmi/vim-snapshots

#20150119-01 :: go :: 우분투에서 go language 설치하기

$ cd /work/apps

$ mkdir golang

$ cd golang

$ wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz

$ tar -C ./ -xzf go1.4.1.linux-amd64.tar.gz


$ cd /work/workbench

$ mkdir golang

$ cd golang

$ mkdir bin pkg src


$ cd ~/

$ vi .bashrc

# go

export GOROOT=/work/apps/golang/golang

export PATH=$PATH:$GOROOT/bin
export GOPATH=/work/workbench/golang
export PATH=$PATH:$GOPATH/bin

$ source .bashrc