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!") }