Goを学んでみた。

はじめに

Goについてずっと気になっていたので少し学んでみました。

目的としては、スクリプト言語で概ね隠蔽されているプログラムの低レベルな処理(wwwやHTTPなどの概念)に関して理解を深めたかったからです。

Dropboxなどにも使われているらしい。

✅ゴール
・Goの理解を深める

✅環境
Windows/XAMPP/MySQL

✅参考教材
📚スターティングGo言語
購入した書籍

📚Goプログラミング実践入門
HTTPなどWebアプリ制作の大前提(隠蔽されがち)な部分についても深く触れている。
💻A Tour of Go
💻はじめてのGo言語
💻Progate
5/27追記:久しぶりに有料会員になったので少しやってみた。

Go

✅特徴
C言語の実行速度ほどはないにせよ速い
コンパイラ言語(仮想マシンVMを備えない/ネイティブコードへコンパイルされる/マルチプラットフォームで動作する)
オブジェクト指向、例外機構(共有ライブラリ)が組み込まれていない
Cで取り扱うプログラムの要素がほぼそのまま備わっている/多くの面で改良されたC(互換性が重視されているらしい)
静的型付け言語(変数の代入時型を宣言)※:=を使うと明らかな型は自動で設定してくれる。

👉OSやCPUの差異を隠蔽できる。

📝メモ
Google社によって開発。僕が現在学んでいるPHP/JSはLLと呼ばれるオブジェクト指向機能を有している動的型付言語&スクリプト言語。(VMで解釈/実行される)

基本

✅出力:println(※print lineの略)

main.go

package main
func main() {
    println("Hello, Go")
}

ターミナル

 

go run main.go
>> Hello, Go

✅変数

「var 変数名 データ型 = 値」で定義。

※:=を使うとデータ型含め、省略が可能。

package main
func main() {
  var n int = 100
  println(n) // 100
  a := 100
  b := 200
  println(a,b) // 100 200
}

※代入・更新時は=を使う。また定義して使われていない変数や型の不一致があるとエラーになる。

 

✅標準パッケージ

Goには標準パッケージと呼ばれる100種類以上の便利な機能が最初から用意されている。
使うにはパッケージ名.機能名とする。

fmt:コンソールに出力
math/rand:ランダムな数値を生成できる
time:時間に関する処理ができる

package main
import "fmt"
func main() {
  fmt.Println("hello world") // hello world
}

※Pは大文字!printlnに比べて表示できるデータ型が多い。パッケージを使っていない際はエラーになる。

 

・書式付き出力

%sを文字列の中に含めると、「fmt.Printf」の2つめに指定した文字列が%sの部分に挿入されて出力。
数値の場合は%dを使う。

func main() {
  name := "Sato"
  fmt.Printf("Hello、%sさん",name) // Hello、Satoさん
}

🙄PHPで使う標準入力に近い感じ。

✅関数

「func 関数名(){…} 」で定義できる。

※main関数はプログラムが実行されると最初に呼び出される特別な関数

✅ポインタ

スコープを超えて値を変更することができる機能。

Goではアドレスをポインタと呼んで扱っている。
「&変数名」で変数のアドレスを取得し、ポインタを代入した変数をポインタ型変数と呼ぶ。

ポインタ型変数を定義するには、変数のデータ型に「*(アスタリスク)」をつけて宣言。
更新は「*変数名 = 更新する値」で可能。

コンピュータにはメモリと呼ばれる作業場所のようなものが存在。
変数はそのメモリに記録されており、その場所をアドレス(16進数で表現されることが多い)と呼ぶ。

環境構築

こちらからダウンロード。実行してインストール。※Next押すだけで問題なし。

②環境変数を設定

"C:\Go\bin"

③バージョン確認(コマンドの確認)

④GOPATH変数のディレクトリ(新たに作成して)を指定

"C:\Go\gopath"

⑤gocode(コマンドラインツール)の導入

go get github.com/nsf/gocode

Hello World

hello.goを作成

package main
import (
    "fmt"
)
func main() {
    fmt.PrintIn("Hello,Worid!")
}

1行目でパッケージの宣言(mainパッケージに属す。宣言できるのは1つのみ)
2行目にプログラムで使用するパッケージをインポート。
3行目以降でプログラム本体である関数mainの定義

👉package mainと書かれたファイルのmain関数の{}の中に命令を書くとそれが順に実行される。

コマンド

go run hello.go
>>Hello, World!
>># command-line-arguments
.\hello.go:8:2: undefined: fmt.PrintIn

ちなみに以下だとエラーになった。インデントはハードタブ(タブ文字)のためらしい。

✅ビルド

go build
go build -o hello hello.go // -oオプションで名前を指定することも可能
go build -o hello.exe hello.go // windowsの場合、実行形式も指定する。

実行。go run と同様の結果を得られる◎また、コンパイルするとファイルサイズも非常に大きくなるのが特徴。

躓いた点

✅VScodeのインデントが半角スペースになる。

解決:Detect Indentationのチェックを外す

参考:VSCodeのエディター設定の話 – タブ文字がなぜか半角スペースになってしまう【Visual Studio Code】特定のファイルだけタブのスペース数が違うとき(直接は関係ないがこれも同様の設定で解決する。)

おわりに

5/8時点:

簡単シンプルとうたわれてはいますが、やっぱり初めての言語はそれなりに学習コスト高いと感じました。

引き続きゆる~くではありますが、継続して勉強していきたいと思います。

5/27追記:

Progateを利用すると浅くはあるものの言語の体系的な理解が書籍に比べ簡単にできて非常に便利だと思いました。

オブジェクトがなく、関数でプログラムを作るという点が面白かったです。

また、内部的な理解をしたいならNode.jsを深堀するでもいい気がしてきました。

📝参考
[翻訳]Go言語の構文がC言語から大胆に変わった理由
GoからCのライブラリを呼ぶ こんなこともできるのね。
CとGo -Go言語のご紹介- Goの開発者はCのベースとなるB言語というものを開発した方らしい。
関数型プログラミングはまず考え方から理解しよう HaskellやScalaなどがあるらしい。マルチパラダイム言語。
Golangのテンプレート(Template)を使ってみる HTMLベースそれこそJSのJSXみたいなこともできるのね。
【Go言語】GinでTemplateパッケージにCSS等のファイルを適用させる FW使えばUI/API層完結できそう

~~以下勉強前に調べたもの~~
📚スターティングGo言語 基礎文法。1冊目に良さげ。
📚
Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る 2冊目に良さげ。フレームワーク使わない。
📚
みんなのGo言語[現場で使える実践テクニック]
💻Go言語Webフレームワークランキング とりあえずGinってのが良さげ??
💻Golang フレームワーク比較
💻【2019年度版】Go言語のおすすめフレームワーク 5選
💻Go / Gin で超簡単なWebアプリを作る
💻Gin Web Framework(公式)
💻【Go】技術ブログサイトを自作してみよう! これやってみたい。
💻静的サイトジェネレータHugoを使ってブログを作ろう! Goの知識不要らしいけど気になる!!

学習の備忘録

✅Goのパッケージ

・OSパッケージ※書籍64%

各OSに依存した機能群を内部に隠ぺいしたプラットフォームに独立したAPIを提供する。ファイルや環境変数の操作やプロセス情報の参照などができる。

・インタフェース:メソッドの型だけを定義した型

📝割愛した部分

P31 パッケージと構成 パッケージ名がそのままディレクトリ名になるようにファイル構成を行う。
P47 セミコロンを明示的に記載する必要がない
48% ポインタ(値型)データ構造のメモリ上のアドレスと型の情報

コメントを残す