tar

tar : 複数のファイルをまとめて1つのアーカイブファイルとして作成するコマンド

tarで作成されたアーカイブは拡張子「.tar」として書庫化され、1つのファイルをまとめて管理できる

圧縮したアーカイブを作成する

$ tar czvf [archive_filename] [dir_name]/            ←ディレクトリをアーカイブファイル
$ tar czvf [archive_filename] [file_name] [file_name] ←ファイルをアーカイブファイル
c: 新しいアーカイブを作成する
z: アーカイブをgzip形式で圧縮する/gzip形式で圧縮されたアーカイブを展開する
v: 実行結果を表示する
f: アーカイブファイル名を指定する
t: アーカイブの内容の一覧を表示する
f: アーカイブファイル名を指定する

ディレクトリ・アーカイブ

$ ls ks/
ks_1.cfg    ks_2.cfg    ks_3.cfg

$ tar czvf ks.tar.gz ks/
a ks
a ks/ks_1.cfg
a ks/ks_3.cfg
a ks/ks_2.cfg

$ tar tf ks.tar.gz
ks/
ks/._ks_1.cfg
ks/ks_1.cfg
ks/._ks_3.cfg
ks/ks_3.cfg
ks/._ks_2.cfg
ks/ks_2.cfg

ファイル・アーカイブ

$ tar czvf ks.tar.gz ks_1.cfg ks_2.cfg ks_3.cfg
a ks_1.cfg
a ks_2.cfg
a ks_3.cfg

$ tar tf ks.tar.gz
./._ks_1.cfg
ks_1.cfg
./._ks_2.cfg
ks_2.cfg
./._ks_3.cfg
ks_3.cfg

圧縮したアーカイブを解凍・展開する

tar xzvf [archive_filename]
x: アーカイブからファイルを取り出す
z: アーカイブをgzip形式で圧縮する/gzip形式で圧縮されたアーカイブを展開する
v: 実行結果を表示する
f: アーカイブファイル名を指定する
$ tar xzvf ks.tar.gz
x ks/
x ks/._ks_1.cfg
x ks/ks_1.cfg
x ks/._ks_3.cfg
x ks/ks_3.cfg
x ks/._ks_2.cfg
x ks/ks_2.cfg

Golang6

定数:const

定数は型なしで宣言できる

/var/main.go

package main

import "fmt"

const Pi = 3.14

const (
    Username = "test_user"
    Password = "test_pass"
)

func main() {
    fmt.Println(Pi, Username, Password)
}
$ go run main.go 
3.14 test_user test_pass

constの宣言時にoverflowするような記法ができて、コンパイル時に型が指定される。

package main

import "fmt"

const c_big = 9223372036854775807 + 1

func main() {
    fmt.Println(c_big - 1)
}
$ go run main.go 
9223372036854775807

定数宣言(const)の内で既定される識別子 iota

iotaは、型なしの連続した値を生成できる

package main

import "fmt"

const (
    c1 = iota
    c2
    c3
    c4
    c5
    c6
    c7
    c8
)

func main() {
    fmt.Println(c1, c2, c3, c4, c5, c6, c7, c8)
}
$ go run main.go 
0 1 2 3 4 5 6 7

Golang5

変数

変数は"var"で、"var 変数名 型名"の形式で宣言する。

var/main.go

package main

import "fmt"

func main() {
    var (
        i    int     = 1
        f64  float64 = 1.2
        s    string  = "test"
        t, f bool    = true, false
    )
    fmt.Println(i, f64, s, t, f)
}
$ go run main.go
1 1.2 test true false

初期値の指定や型の省略が可能で省略した場合は、初期値の値に応じて自動的に型が決まる。初期値を省略した変数には型ごとに決まっている「ゼロ値」で初期化される。

package main

import "fmt"

func main() {
    var (
        i    int
        f64  float64
        s    string
        t, f bool
    )
    fmt.Println(i, f64, s, t, f)
}
$ go run main.go
0 0  false false

Go言語の変数スコープはグローバルとローカルの2種類で、ソースのトップレベルで宣言すれば、グローバルスコープ、関数内で宣言すれば、ローカルスコープ

ローカルスコープの変数に限り、変数の型は指定できないが、「変数名:=式」の形式で宣言できる

package main

import "fmt"

func main() {
    xi := 1
    xf64 := 1.2
    xs := "test"
    xt, xf := true, false
    fmt.Println(xi, xf64, xs, xt, xf)
}
$ go run main.go
1 1.2 test true false

変数の型を調べるとき、Printfの%を使う

package main

import "fmt"

func main() {
    xf64 := 1.2
    fmt.Printf("%T\n", xf64)
}
$ go run main.go
float64

型をfloat64ではなく、float32にしたい場合、varを使って宣言する

package main

import "fmt"

func main() {
    xf := 1.2
    fmt.Printf("%T\n", xf)

    var xf2 float32 = 1.2
    fmt.Printf("%T\n", xf2)
}
$ go run main.go
float64
float32

Golang4

1) godoc:Web only

$ godoc -http=:6060

Browser : http://localhost:6060/

2) go doc : CUI

/import/main.go

package main

import (
    "fmt"
    "os/user"
    "time"
)

func main() {
    fmt.Println("Hello world!", time.Now())
    fmt.Println(user.Current())
}
$ go doc fmt.Println
func Println(a ...interface{}) (n int, err error)
    Println formats using the default formats for its operands and writes to
    standard output. Spaces are always added between operands and a newline is
    appended. It returns the number of bytes written and any write error
    encountered.
$ go doc os/user.Current
func Current() (*User, error)
    Current returns the current user.

    The first call will cache the current user information. Subsequent calls
    will return the cached value and will not reflect changes to the current
    user.
$ go run main.go
Hello world! 2019-09-17 12:07:35.26346 +0900 JST m=+0.000249589
&{501 20 name NAME /Users/name} <nil>

curl

curl:さまざまなプロトコル(HTTP, HTTPS, FTP, SFTP, LDAP, TELNET etc.)に対応したデータを転送するためのコマンド

$ curl [オプション] [url]
$ curl [オプション] [url] > 保存ファイル名

curl -s (-silent) [url] :実行中のメッセージを表示しない→アクセスの確認

$ curl -s http://192.168.2.2:3001/

*ファイル保存

< form 形式 >

curl -F (--form) [file_name] [url]:指定した内容をフォームから入力したのと同じように送る(method="post")。@マークをつけて、ファイルを指定。

$ curl -F name=my.data -F file=@test.dat http://192.168.2.2:3001/storage/ 

$ curl -s http://192.168.2.2:3001/storage/
{"files":["/my.data"]}

< method 形式 >

curl -X (--request) [method] -T (--upload-file) [file_name] [url]

$ curl -X PUT -T ks_1.cfg http://192.168.2.2:3001/storage/my.data

$ curl -s http://192.168.2.2:3001/storage/
{"files":["/my.data"]}

curl [url] -o (--output) [file_name]: 取得したデータを指定したファイルに出力する。

$ curl http://192.168.2.2:3001/storage/my.data -o output
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  247k  100  247k    0     0  6147k      0 --:--:-- --:--:-- --:--:-- 6192k

curl -I (--head) [url]:ヘッダ情報を取得する

$ curl -I http://192.168.2.2:3001/storage/my.data
HTTP/1.1 200 OK
Content-Length: 253643
Last-Modified: Tue, 17 Sep 2019 07:41:01 JST
Date: Mon, 16 Sep 2019 23:21:59 GMT

curl -X (--request) [method] [url]:HTTPメソッドを指定する

$ curl -X DELETE http://192.168.2.2:3001/storage/my.data

Golang3

PublicとPrivate

名前の先頭を大文字にするとPublicとなり、異なるパッケージに属するソースファイルからは参照ができる

名前の先頭を小文字にするとPrivateとなり、異なるパッケージに属するソースファイルからは参照ができない

human.go

package mylib

import "fmt"

type Person struct {
    Name string
    Age  int
}

func Say() {
    fmt.Println("Human!")
}

main.go

package main

import (
    "fmt"

    "./mylib"
    "./mylib/under"
)

func main() {
    s := []int{1, 2, 3, 4, 5}
    fmt.Println(mylib.Average(s))

    mylib.Say()
    under.Hello()
    person := mylib.Person{Name: "Mike", Age: 20}
    fmt.Println(person)
}

Golang2

パッケージ(package)

・プログラムは、mainパッケージのmain関数から開始する
・ソースファイルがどのパッケージに属するかは"package"文で指定する
・パッケージは、一つ以上のソースファイルで構成される
・同じパッケージに属するソースファイルは、全て同一のディレクトリに格納する
・一つのディレクトリに複数のパッケージを配置できない
・パッケージ名と格納ディレクトリ名は同じにする(慣例)
.
└── package
    ├── main
    ├── main.go
    └── mylib
        ├── human.go
        ├── math.go
        └── under
            └── sub.go

main.go

package main

import (
    "fmt"

    "./mylib"
    "./mylib/under"
)

func main() {
    s := []int{1, 2, 3, 4, 5}
    fmt.Println(mylib.Average(s))

    mylib.Say()
    under.Hello()
}

mylib/math.go

package mylib

func Average(s []int) int {
    total := 0
    for _, i := range s {
        total += i
    }
    return int(total / len(s))
}

mylib/human.go

package mylib

import "fmt"

func Say() {
    fmt.Println("Human!")
}

mylib/under/sub.go

package under

import "fmt"

func Hello() {
    fmt.Println("Hello!")
}