Open13

【学習記録】Golangの入門

ガマリガマリ

記事内容

  • Golangの入門を行うので、その記録をする。
  • 開始日は2021/07/22
  • 暫定の目標としては「チャット」を作る

リンク(自分用)

VSCodeでエラーが出続けたら

備考

個人的なメモ書きです。
その場の思いつきで書くことが多いので、体系だってません。。。
色々と知識が集まったら、整理とかしようかなと思っています。

ガマリガマリ

For文

package main

import "fmt"

func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		sum += i
	}
	fmt.Println(sum)
}

ポイント

  • 基本は他言語と同じ。
  • ただし()で括る必要はなし。

If文

package main

import (
	"fmt"
	"math"
)

func sqrt(x float64) string {
	if x < 0 {
		return sqrt(-x) + "i"
	}
	return fmt.Sprint(math.Sqrt(x))
}

ポイント

  • 基本的に他言語と同じ
  • ただしこちらの()でくくる必要なし。
ガマリガマリ

for文2

Arrays(配列)

固定長。

スライス

可変長。
データを柔軟に格納できる。
大きさの指定をしない

ary := []string{"12", "23", "34"}

追加

newSlice =append(slice, 要素)

range

var slice = []string{"1", "2", 3"}
for index, value := range slice {
  //処理
}

range節は、「スライス」や「マップ」を一つずつ反復処理するために使う節。
スライスをrangeで利用する場合、2つの変数が必要。

1つ目がindex
2つ目がvalue

不要な値は_で受け取れば使わなくて済む。

ガマリガマリ

Goのパッケージ管理

(めっちゃ内容飛んでる気が・・・)

https://qiita.com/Syoitu/items/f221b52231703cebe8ff

概要

GOMODULEというパッケージ管理を使うと良い。
(イメージとしてはpipとかかな?)

初期設定

go mod init gomodtest

パッケージ追加

go get -u go.uber.org/zap

パッケージをゲットする。

go.sumファイルが増える。
パッケージが不正な改善がされていないか、確認できるらしい。

既存のモジュールのインストール

go mod tidy

pip install フリーズしたファイル
みたいなイメージ?

ガマリガマリ

gRPC

調べてると、なんかgRPCっていう規格を見つけた。
一見してすごい便利そうだったので、試しに使ってみる。

参考

https://zenn.dev/miyazi777/articles/dbed823239aa17a9c82b

一番わかりやすいので参考にさせていただいた。

調べたいこと

  • RPCっていう規格って何?
  • Flutterから使える?
  • ドキュメントの作り方
ガマリガマリ

go + VSCodeでなんか依存関係のエラーが出る

何故かこの組み合わせだと、エラーが出る。

環境

VSCode:
versrion: 1.58.2
go:
version: 1.16.6

事象

以下のエラーでVSCodeがグルグルする。

Error loading workspace: You are outside of a module and outside of $GOPATH/src. If you are using modules, please open your editor to a directory in your module. If you believe this warning is incorrect, please file an issue: https://github.com/golang/go/issues/new.

原因

gopllsというツールのエラーだそうです。

https://teratail.com/questions/297608

解決

エラーのところを解消すれば、ひとまずエラーは消える。

継続1

次は、go moduleで「github.com/gin-gonic/gin」がインポートできない問題が発生。

ガマリガマリ

調査[継続1]

https://github.com/golang/go/issues/44366

なんかムズそう。
根本的にそういった事象が起きてるっぽい?

解決

https://www.it-swarm-ja.com/ja/go/各vscodeプロジェクトに「gopath」を設定する/829556249/

一応解決はできた。
やったこととしては、VSCodeの各ワークスペースのsettingsパスに、ワークスペースのパスを「GOPATH」を通すことで解決?
(なんか無理矢理感ある気がする)

原因?

(推測多め。信憑性は低)
WORKSPACEを複数開くことで、golpsがうまく読み取れてないっぽい?
実際、「go run」コマンドを叩くと、基本的に動く。

手順

手順としては以下の通り。

  1. WORKSPACEで「CTRL + SHIFT + P」で「設定」を呼び出す。
  2. settings.jsonを出す(なんか適当なファイル触れば出てくる)
  3. 「"go.gopath": "該当のワークスペース"」これをsettings.jsonに追加する。
  4. 再起動するとエラー解消する。

備考

根本解決って感じがしない。
なんとなく、今回の原因として「複数ワークスペース」を開いた時に起こる事象だと思った。
(単一のワークスペースだと、この問題が出ない)

settings.jsonを追加しないなら、ワークスペースを1つだけにすることで回避。

ガマリガマリ
The Go language server is currently not supported in a multi-root set-up with different GOPATHs.

普通にエラーで出てきた。

https://github.com/golang/tools/blob/master/gopls/doc/workspace.md

The workspace module feature is currently available as an opt-in experiment, and it will allow you to work with multiple modules without creating workspace folders for each module. You can try it out by configuring the experimentalWorkspaceModule setting.

お、これっぽい。
リンク先を見ると、settings.jsonの設定があった。

https://github.com/golang/tools/blob/master/gopls/doc/settings.md#experimentalworkspacemodule-bool

experimentalWorkspaceModule
この値をfalseにすることで、回避できた!!

ざっと読んだ感じ、最近のgoはマルチモジュールを許可してない?っぽい。

ガマリガマリ

そもそもgoplsの設定はずせば解決やないか……
(なんでgopls入ってるんだろ。入れた覚えなし)

手順

  1. ctrl + shift + P
  2. preference
  3. goのuse language serverを無効化する。
  4. おわり
ガマリガマリ

Structに関して

構造体。
C++を少し触った時に学んだぐらいの知識。

Structのタグ

https://qiita.com/itkr/items/9b4e8d8c6d574137443c

goの構造体は、タグを付与して「参照可能なメタ情報」をつけることができるらしい。

type Organization struct {
    Name     string `label:"名前"`
    Language string `label:"言語"`
}

用途

  1. jsonパッケージでは、jsonタグを参照してキー名を利用する。
  2. バリデーションにも使える

(詳しいことはリンク先の方が解説してるので、そちらを参照)

タグは複数つけられる

type Organization struct {
    Name     string `label:"名前" json:"name" validate:"required"`
    Language string `label:"言語" json:"language" validate:"required"`
}