Skip to content

Instantly share code, notes, and snippets.

@Iwark
Created November 22, 2015 01:19
Show Gist options
  • Save Iwark/8a294789add68b9a61fa to your computer and use it in GitHub Desktop.
Save Iwark/8a294789add68b9a61fa to your computer and use it in GitHub Desktop.
11/24 Go言語勉強会用資料(作成中)

The presentation

@iwark02

Go言語とは・Go言語の特徴

  • Googleが2009年に公開した比較的新しい言語

パスの設定

ホームディレクトリ以下のgocodeディレクトリを
作業ディレクトリとする場合、下記のようになる。

export GOPATH="$HOME/gocode"
export PATH="$GOPATH/bin/:$PATH"


bash_profileやzshrc等に書いておくと、
起動時に読み込まれるため、毎回打つ必要がなくなる。

Windowsの人は
「windows 環境変数 path」とかでググってください。

Go言語のはなし

変数宣言

var n int = 1 // int型の変数n
n = 2
n += 1
n := 1 // 型推論(1を代入しているのでint型であると推論される)
n *= 3

関数宣言

func add(a int, b int) int{
  return a + b
}
func calc(a int, b int) (int, int, int, float32){
  return(
    a + b,
    a - b,
    a * b,
    float32(a) / b
  )
}

構造体

var person = struct {
  height float32,
  weight float32    
}

Hello World

では、初めてのGoコードを書いてみましょう!

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

これを、次のようにコンパイルできます。

go install github.com/ユーザ名/hello

あるいは、helloディレクトリにいる場合、

go install

でもコンパイルができるはずです。

実行してみましょう。

$GOPATH/bin/hello

PATHが正しく設定されていれば、

$ hello

で実行できるはずです。

では次にライブラリを1つ作ってみましょう。

$ mkdir $GOPATH/src/github.com/ユーザー名/stringutil
package stringutil

// 文字列を反対から表示します
func Reverse(s string) string {
	r := []rune(s)
	for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
		r[i], r[j] = r[j], r[i]
	}
	return string(r)
}

パッケージ

Go言語のソースファイルは「パッケージ」という単位でグルーピングされ、各パッケージには1つ以上のソースファイルが所属します。 Go言語のソースファイルは必ずpackage文で始まります。

問題

次のLinuxコマンドをGo言語で実装せよ!

Q1

ls: カレントディレクトリにあるファイルの一覧を出力する。 余力がある人は、コマンド引数でディレクトリを指定できるようにする。

ディレクトリを読み込むのは... "io/ioutil"パッケージのReadDir

コマンド引数を扱うには... "os"パッケージのArgs

こたえ:

package main

import (
  "fmt"
  "io/ioutil"
  "os"
)

func main() {
	// 出力するディレクトリの初期値
	target := "./"
	// 引数があれば上書き
	if len(os.Args) == 2 {
		target = os.Args[1]
	}

	files, err := ioutil.ReadDir(target)
	if err != nil {
		fmt.Println(err)
	} else {
		for _, f := range files {
			// ディレクトリは末尾に「/」をつける
			if f.IsDir() {
				fmt.Println(f.Name() + "/")
			} else {
				fmt.Println(f.Name())
			}
		}
	}
}

grep: テキストファイルを読み込んで コマンド引数で指定された文字列を含む行だけを出力。 余力がある人は、正規表現にも対応する。

package main

import (
  "bufio"
  "fmt"
  "os"
  "regexp"
)

func main() {

  grepString := os.Args[1]
  filePath := os.Args[2]

  regex := regexp.MustCompile(grepString)

  file, err := os.Open(filePath)
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }

  defer file.Close()

  scanner := bufio.NewScanner(file)

  for scanner.Scan() {
    text := scanner.Text()
    if regex.Match([]byte(text)) {
      fmt.Println(text)
    }
  }  
}

Q3: httpコマンド

引数で指定されたURLへHTTPでアクセスして、その結果を表示する

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment