Go関連のことを調べてみた2022年09月18日

Go関連のことを調べてみた2022年09月18日

TinyGoでWasmをbuildするまでの内部実装

# TinyGoとWasm
TinyGoとは組み込み向けアーキテクチャで動作させるGo言語のコンパイラです。サポートしているマイコンボードの一覧は、GitHubのReadMeに記載されています(https://github.com/tinygo-org/tinygo)。
TinyGoの特徴として、Wasmにコンパイルさせることができます。Wasmは今後発展していきそうな技術トピックの1つだと思います。OS非依存にVMで動く、ブラウザで動作するなど、将来性を感じさせてくれる技術です。

本記事では、tinygoコマンドを実行した際、内部で何が起きているのか、コードを追って調べました。

## TinyGoでWasmを動かす

“`golang
// main.go
package main

import “fmt”

func main() {
fmt.Println(“hello world”)
}

“`
main.goを作成したら、以下のコマンドを実行すればwasm.wasmが出力されます。
“`
tinygo build -o wasm.wasm -target was

元記事を表示

プログラミング言語Go(技術書)のアウトプット(1章)

# はじめに
この記事は、[プログラミング言語Go](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9EGo-ADDISON-WESLEY-PROFESSIONAL-COMPUTING-Donovan/dp/4621300253)という技術書を勉強したことのアウトプットになります。
自分自身、Goに関しては全くの初心者で、この記事の内容も間違っている場合があると思いますので、コメントなどで指摘していただけると幸いです。

# プログラミング言語Goを勉強する理由
理由としては、「プログラミング言語の本質的な勉強が自分には必要だと感じたから」です。
自分が今までに多く触れてきた言語だと、RubyやJavaScriptで、どちらの言語においても、その言語のフレームワークを使用することが多く、RailsやReact、Vueを使っていました。
というのも、フレームワークを使えば、自分の作りたいものが比較容易に作ることができ、就活に活か

元記事を表示

Clean Architecture with Go

# ? はじめに
この記事は、クリーンアーキテクチャとGo言語を半年ほど勉強した人の知見をまとめたものです。[zenn](https://zenn.dev/88888888_kota/articles/1a5caac8d743b8)にも同じ内容を投稿しています。この記事の対象者としては、
* クリーンアーキテクチャ聞いたことあるけどGoでの実装方法?
といった方を想定しています。

自分自身も、完全に理解しているとは言い難いですが、ある程度知見が溜まってきたのでまとめておきます。Go言語でクリーンアーキテクチャを実現したい方の参考になれば幸いです。

# ? クリーンアーキテクチャとは?
* システム設計ガイドラインの1つ
* メリット
* 疎結合、関心の分離により変化に強い
* テストが容易
* デメリット
* コードが冗長
* わかりにくい
# ? 実際に実装してみる
クリーンアーキテクチャに関しては、ネット上の記事を読んでもあまりピンとこないかもしれないので、**実際に実装**してみることあるいは**実際のコードを読む**ことが理解の近道だと思います。その際、参考になるレ

元記事を表示

GolangのSlice挙動メモ:copy, append, len, cap, 関数に渡して変更したときどうなるか。

## Goのスライスでハマった(定期)

スライスを関数に渡して関数内で長さが変わって増えた分が呼び出し元で見れない問題にハマった。
結論としては、長さを変えてやればOKだった。(変えれないと思っていたら変えれた)

“`go
package main

import “fmt”

func main() {
data := make([]byte, 0, 16)
data = append(data, []byte(“abcd”)…)
fmt.Println(“1 “, string(data))
newLen := repeater(data)
fmt.Println(“3 “, string(data)) // ここでは足されたデータが見えなーい
data = data[0:newLen] // 長さを変えると、世界が変わるー (cap超えぬようにね)
fmt.Println(“4 “, string(data))
}
// 同じデータを繰り返して足す。長さが倍になる。
func repeater(data []byte) int {
d

元記事を表示

Docker GoでREST APIを作成、MySQLに接続する

# はじめに
本格的にアプリ開発を始める前に、練習として
Dockerを用いてGoコンテナ、MySQLコンテナを作成、
MySQLからデータを取得するAPIを作成しました。

作成の手順、参考にした記事をまとめてます。

# 使用技術
Go
net/http

# Dockerとは
以下の記事を参照

# 実施したこと

## DockerでGoコンテナを作成、Docker
Goコンテナ、MySQLコンテナを同時に作成する前に、
Goコンテナのみ作成しました。
初めてに触れるので、Dockerに慣れるために

DockerでGoコンテナを作成、
Docker上でGoサーバーを起動させました。

参考にした記事は以下の記事です。
https://www.yoheim.net/blog.php?q=20170403
https://zenn.dev/kenny/articles/b9dd668bf09efe
https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53
https://docs.docker.jp/engine/reference

元記事を表示

Goで簡易な集合型を実装してみよう

# はじめに

Goには、集合型が存在しない。Goで集合型っぽいことを実装するには様々な方法があるが、空のstructをvalueとして持つmap型を定義する方法が使い勝手が良い。今回はこれを利用してSet型の定義を行い、簡易なメソッドを実装してみよう。

# 実装

“`golang
type Set map[interface{}]struct{} // Set型の定義

func NewSet() *Set { // 新しい集合を作成
return &Set{}
}

func (s Set) Add(key interface{}) { // 集合に値を追加
s[key] = struct{}{}
}

func (s Set) Delete(key interface{}) { // 集合から値を削除
_, ok := s[key] // 値の存在判定
if ok {
delete(s, key)
}
}
“`

※今回は簡易的な実装のためmapのkey(interface{})の型判定は実装していない

# How to use

“`golang
fu

元記事を表示

Goで package … is not in GOROOT エラーが発生した時の自己解決備忘録

# 前提条件
### 今回のgoバージョン
– golang:1.19.1-alpine (dockerイメージ)

## 参考にしたサイト
https://qiita.com/fetaro/items/31b02b940ce9ec579baf

上記のサイトより、二つの挙動があることがわかった。
– GOPATHモード
– モジュールモード

## 現在のモードを調べる
なんでも良いので外部のライブラリをimport文に含めて、`go run`を行う。(go getしない)
“`go:~~.go
import (
“go.mongodb.org/mongo-driver/mongo”
)
“`

エラー文に `~~/scr/~~`のパスが表示された場合、同じ解決策が通用するかもしれない。

# 解決方法
“`shell:ターミナル
$ go mod tidy
“`
– [tidyについて](https://note.com/artefactnote/n/n6709b53a318f)

## 補足
多くのwebページで go.modファイルに`replace`を

元記事を表示

一般大学生がGo言語に初めて触れてみた!!【スターティングGo言語】

# はじめに
最近インターンシップや本選考を見るとやたら**Go言語**を使っている企業が多い気がします(笑).
なので,Go言語について勉強したいなと思い,書籍を購入しました.
今回は,Go言語初学者として[スターティングGo言語(松尾 愛賀/翔泳社)](https://www.amazon.co.jp/dp/4798142417?tag=keiji009-22&linkCode=ogi&th=1&psc=1)を購入し,当書を読んで感じたGoの印象を書いていきたいと思います!!
誰かしらの参考になればな…と思いながら書きましたので,気軽に見てもらえると嬉しいです?

[](https://www.amazon.co.jp/dp/4798142417?tag=keiji009-22&linkCode=ogi&th=1&psc=1)

# 当書のいいところ
まず

元記事を表示

Oracleを使うGoアプリのコンテナ化メモ(準備編)

# はじめに
私のこれまでの記事を見てわかる通りJava関連しかやって来ませんでした。
また利用するDBもPostgreSQLがメインだったのでOracleDBとは幸いなことにあまり関わってこなかったのですが、仕事関係で色々ありGo言語+OracleDBを使うことになりました。

最初は「えっ?Oracle?MySQLとかPostgreSQLでいいやん、駄目なの?」と思いつつも「了解でーす」というノリで引き受けてしました。
いざ始めてみるとライブラリの設定やアプリのDockerイメージビルドでかなり苦労しながらもGithubのIssueやStackoverflowと睨めっこが続きました。

というわけでこの苦労を忘れてしまわないように、メモとして残そうと思い立ち今に至ります。

# 環境
私の実行環境は以下の通りです。

| 環境/ツール類 | バージョン |
|:————-|:———-|
| OS | Windows10 |
| Ubuntu(WSL) | 20.04.4 |
| Golang | 18.5

元記事を表示

【Golang】Go言語で簡易的なcatコマンドを作成してみた

# はじめに
Go言語を勉強する中で簡易的なcatコマンドを作成したのでまとめます。
Go言語に慣れるための練習として書いているため、エラー処理などは思いついたまま書いています。よりGo言語らしい(?)書き方があると思いますが、今回は気にせず書いています。
簡易版ということで、オプションは`[-n]`と`[-b]`の2つだけを実装しています。

# コード
今回はオプション機能に関するコードを main.go とは別のファイルに書いています。
よって、goのファイルは `main.go` と `cat_option.go` の2つになっています。

## main.go
“`main.go
package main

import (
“bufio”
“flag”
“fmt”
“log”
“os”
)

func main() {
var (
n = flag.Bool(“n”, false, “行番号を付けて表示する”)
b = flag.Bool(“b”, false, “空行以外に行番号を付けて表示する”)
)

flag.Parse()

// 引数

元記事を表示

Visual Studio CodeでGoのフォーマッターが動作しなかった

# はじめに
 Visual Studio CodeでGoプログラムを書くとき、フォーマッターが動作しなかった。動作をさせるまでに行った方法、調べた記事を記載する。
 様々な方法を試した結果、動作するようにはなったが、何が原因で動かなあったのかわからなかった。
 個人の作業記録として記事を残します。

# 実施したこと
1. Visual Studio Codeのsetting.jsonにgoのフォーマッタを設定。
これだけでは動かなかった。
“`
“[go]”: {
“editor.defaultFormatter”: “golang.go”
},
“`

参考記事
[vscodeでgolangが自動整形されない問題](https://zenn.dev/t_morooka/articles/24ce28f4844895
)

2.Visual Studio CodeのGoの拡張機能をアンインストール、再度インストースし直した。
直らなかった。
3.GoがUbuntuにダウンロードされているか、WSLを起動して以下コマンドを叩くことで再度確認した。
“`
go

元記事を表示

Golangのinterfaceでポインターを試した

# はじめに
直近はRUSTを勉強していますが、以前勉強したGolangを忘れないように、[Tour of Go](https://go-tour-jp.appspot.com/welcome/1) を利用して復習します。interfaceの理解に対して、忘れないようにここでメモを残ります。
Key: Struct, pointer, interface

# Target
part1: インタフェースでポインターを出力できるようにする
part2: インタフェースが出力タイプを指定する際に、ポインター指定クラスが利用して、errorの再定義ができる

# コード試す
## part1
~~~main.go

package main

import “fmt”

// インタフェース
type I interface {
M()
}

// 構造体
type mystring struct {
S string
}

// mystringのポインタクラス
func (f *mystring) M() {
if f == nil {
fmt.Println(“

元記事を表示

ARISE tech blogのGoソースコードをもっとGoっぽく書いてみた

# はじめに

こんにちは。
ARISE analyticsのエンジニアの井上です。

弊社ARISE analyticsの技術ブログに先日Goについての記事を投稿しました。

そのページは[こちら](https://www.ariseanalytics.com/activities/report/20220704/)

この記事ではサーバーサイド開発として使われるPHP, Javaと比較して

Goの書き方とパフォーマンスについて語りました。

ベンチマークの比較を行う上で、なるべく処理方法を共通とするために

Goらしさを排除した書き方をしました。

本記事ではブログで紹介したGoらしくないソースコードを

筆者が考えるGoらしいソースコードを紹介します。

# Goらしいソースコード

では先にGoの特徴を踏まえたコードを見ていきましょう。

まずはバブルソートの例です

“`Go:main.go
package main

import (
“fmt”
“math/rand”
“time”
)

type intSlice []int

func main() {

元記事を表示

ゆめみ株式会社の採用試験をGoで解いてみた

Goについて勉強中なのですが、自分はこれまであまり実装を行ったことがなく、チームビルディングやビジネス寄りを担当していたことが多いため、とにかくなんでもいいから書いてみようと思い、[ゆめみ株式会社のサーバーサイド採用試験サンプル](https://www.yumemi.co.jp/serverside_recruit)で練習してみました。
解いていく中で、ここもっと改善できそうだなとか、ここの仕様は次にコード見た時忘れちゃってそうだなというところはコメントに残して、あとはそんなにコメントしないように意識しました。
まだまだ他の人の解法記事などを読んでいると、自分のコードはもっさりした関数になっていてかっこよくないなと思ってしまいます。
すこしでもかっこいいコードが書けるようにもっと場数踏まなきゃと思います。

## 問題から何が必要かを考えるフェーズ

まず、問題文を見て、どういった処理が必要かを洗い出しました。
1. CSVファイルの読み込み
2. 各プレイヤーの平均スコアを算出
3. 平均スコアの降順に並び替え&順位づけ
4. 10位までのプレーヤーを抽出
5. CSVファイルに書

元記事を表示

go言語で新しいプロジェクトを作る(go v1.18)

### プロジェクト作成とHello World
Go(v 1.18)で新しいプロジェクトを作るにはまずプロジェクト用に適当なフォルダをつくります。
たとえばwebappフォルダを作ります。私はubuntuを使っていますが、Windowsを使っている人はGUIからフォルダの作成をしてください。
“`
$ mkdir ./webapp
“`
そしたらまずはここがgoのプロジェクトのフォルダだと宣言します。
“`
$ cd ./webapp
$ go work init
“`
実際に作業をするのはモジュールのフォルダなのでモジュール用フォルダを作ります。
“`:webapp
$ mkdir ./helloworld
“`
ここでここがモジュールのフォルダだと宣言します。
“`:webapp
$ cd ./helloworld
$ go mod init example.com/webapp/helloworld
“`
なお、パッケージとして一般公開したい場合はモジュール名にちゃんと命名規則があるようです。
参考: https://go.dev/blog/package-na

元記事を表示

WebのフロントエンドでもDockerで開発環境を構築する理由。(余談としての脱node依存開発)

# 1.数ヶ月ぶりにビルドしたらエラーになる

開発中は問題がないのですが、数カ月ぶりにWebpackなりをつかってビルドしてみるとエラーがでる。
フロントエンド開発者なら一度は経験したことがあるのではないでしょうか?
いろんな原因があると思いますが、以下のような条件で起こることが多いのではないでしょうか?

:::note alert
・複数のプロジェクトを開発する端末に直接配置している。
・nodeenvなどのバージョン切り替えツールをいれずグローバルでnodeを使っている。
・ライブラリをプロジェクト内で限定せずグローバルでつかっている。
:::

要は、手元のMacやWindows、Ubuntuなど開発端末上に直接、複数のプロジェクトを配置して開発しつつ、nodeを共有したり、安易にバージョンアップとかしているとビルドができないなどのエラーが発生したりします。

# 2.nodeをつかったフロントエンドのビルドの脆さ

## (1)特定の団体がビルドツールをメンテしてくれる言語

ビルドというのは、Java、Go、Rustなど型付きの言語ではよくしますが、ビルドツール自体が

元記事を表示

【golang】DockerでGoの開発環境を構築する

:::note info
当コンテンツと同様の記事を Zenn でも公開しています。
:::

https://zenn.dev/yusuke49/articles/9ed37838861b1d

Goでボイラープレートを作っていくのですが、その際にDockerを利用して環境構築をしました。
## こんな方におすすめ
– Goで開発を進めていきたいけど極力自分のPC環境を汚したくない
– go module を利用する
– 一つのアプリ開発を通して、Go以外にもnodeやRDBなどの他の技術も必要になる

## 前提
Dockerとdocker-composeが用意できている前提で進めていきます。
Macならターミナルで、WindowsならPowerShellで以下のコマンドを叩くと確認できます。
“`

$ docker –version
$ docker-compose –version


$ docker version
$ docker-compose version
“`

# Docker
Do

元記事を表示

Goのinterfaceでつまづいてしまったあなたへ

どうも ryo_grid です。
最近は自作RDBMSしています。皆さんもどうですか?
[自作RDBMSやろうぜ!](https://ryogrid.github.io/dbms-jisaku/)

というのはさておき、自身はGoのinterfaceの挙動がしばらくよくわからなくてハマったのですが、そこらへんの簡潔な解説がGo公式サイトにも無いし、適当な技術記事も見当たらないなーと思ったので自分で書くことにしました。

細かいことを気にしなければ話は単純です。
なお、ハマりやすいところについてだけ解説するので、それ以前の知識は別途得てください。
 
# Goのinterfaceな型はポインタを保持する箱
– [Goのinterfaceをデータ構造から理解する – Zenn](https://zenn.dev/sivchari/articles/be6cc55d313b12#interface%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)

こちらの記事により詳しく書いてありますが、Goのinterfaceとして定義された

元記事を表示

discordのwebhookを使用してgoから通知を送ってみた

無料版slackだとデータが消えていってしまうということでslackに飛ばしていた通知をdiscordに飛ばせないかと思い実装をしてみました!

参考文献: https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks

# 1. webhook_url取得
まずはここからですね。

1. 通知したいチャンネルの設定を開きます
![スクリーンショット 2022-09-10 13.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/ec57608c-7b4d-c290-4c9c-1de2630dbce8.png)

2. 連帯サービス > ウェブフックURLコピーをクリックして取得します
![スクリーンショット 2022-09-10 13.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/ba

元記事を表示

ISUCONのGo利用割合

Goの紹介を書くために思い立ってグラフ化してみました。情報源はこちらです。

https://isucon.net/

2014ぐらいまでは、利用言語は自由記述と本文に書いてあったり、無記名のチームもあったようなので参考値です。2013では予選はGoで突破したけど本戦は別の言語で出たチームがあったみたい(2チーム突破で8%だったけど決勝は4%になってた)。

Goの開発効率と実行効率を証明する証拠として、JTBCで上司を説得するような場合に便利にご利用いただけるかと思

元記事を表示

OTHERカテゴリの最新記事