- 0.0.1. Go言語クロージャーについての豆知識
- 0.0.2. Go 言語スプレッドシートライブラリ:Excelize 2.4.1 がリリースされました
- 0.0.3. 【Golang】【wasm】テストの仕方と注意点 @ Go 1.16+
- 0.0.4. 【Golang】image パッケージの Bounds とは(四角が描画された画像を作成したい)
- 0.0.5. Goのインストールとチュートリアルメモ
- 0.0.6. 【Golang】TinyGo で WebAssembly.instantiate(): Import #0 module=”wasi_snapshot_preview1″ error: module is not an object or function
- 1. Docker の TinyGo で疲労コンパイる
- 1.0.1. Goの静的解析ツールを作成した
- 1.0.2. excelizeをgo installするとエラー
- 1.0.3. Go言語とGASで翻訳デスクトップAppを10分で作る。
- 1.0.4. JSON-TO-GO を使えば、GO 構造体定義がすこぶる簡単!
- 1.0.5. [Go Snippet] “RANDOM USER GENERATOR” からの JSON を Unmarshal する
- 1.0.6. gomockで同一メソッドを複数回呼び出す際のレスポンスを変える
- 1.0.7. Firestoreをgoの構造体で扱う
- 1.0.8. Go言語 基礎文法
- 1.0.9. Go言語豆知識(一)
- 1.0.10. Go 1.15 で GAE 独自 API を利用できるのか?
- 1.0.11. golangメモ
- 1.0.12. 【小ネタ】Windows環境でgo get がプロキシの関係で入らないとき
- 1.0.13. ブラウザをターミナル代わりにするrttyを作った
- 1.0.14. Go言語を簡単に勉強して思う、言語設計の違いについて
Go言語クロージャーについての豆知識
###背景###
for分の中に関数を書くときに、特にfor分のスコープと関数の組み合わせによって、クロージャーが生成され、関数の実行タイミングはfor分と一致ではない場合は、バグは発生しやすいです。
例えば、javascriptでは以下のようなクロージャー典型例があります。
[Javascriptの豆知識(let,var,クロージャーに関する面接問題)](https://qiita.com/xu1718191411/items/88dee669da14bc8ba749 “Javascriptの豆知識(let,var,クロージャーに関する面接問題”)Javascriptではletという変数宣言方法を活かすことによって、うまくfor分共にあるクロージャー問題点を解消できますが、Go言語だと、どうやって解消できますでしょうか
####問題####
#####コード#####“`golang
func main() {
n := 5funcs := []func(){}
for i:=0;i
Go 言語スプレッドシートライブラリ:Excelize 2.4.1 がリリースされました
[Excelize](https://github.com/xuri/excelize) は、純粋な Go で記述されたライブラリで、XLSX / XLSM / XLTM ファイルの読み書きを可能にする一連の関数を提供します。Microsoft Excel™ 2007 以降で生成されたスプレッドシートドキュメントの読み取りと書き込みをサポートします。 高い互換性により複雑なコンポーネントをサポートし、大量のデータを含むワークシートからデータを生成または読み取るためのストリーミング API を提供します。
場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新
【Golang】【wasm】テストの仕方と注意点 @ Go 1.16+
## WebAssembly 用のアプリでもテストがしたい
> `go test` でテストを実行すると `exec format error` や `imports syscall/js` エラーが出る。
>
> “`text
> fork/exec /tmp/go-buildxxxxxxxxx/xxxx/my_pkg_hoge.test: exec format error
> “`
> “`text
> imports syscall/js: build constraints exclude all Go files in /usr/local/go/src/syscall/js
> “`– 検証環境: Go 1.15.6(`golang:1.15-alpine`), 1.16.5(`tinygo/tinygo:latest`), 1.16.6(`golang:alpine`)(いずれも Docker 環境)
## TL; DR (今北産業)
1. `node.js` をイ
【Golang】image パッケージの Bounds とは(四角が描画された画像を作成したい)
> Go 言語(Golang)のテストで使う画像を作りたい。作り方を調べると出てくる `Bounds` ってどう言う意味?
[「”golang” 画像 描画 四角」でググって](https://www.google.com/search?q=%22golang%22+%E7%94%BB%E5%83%8F+%E6%8F%8F%E7%94%BB+%E5%9B%9B%E8%A7%92)も[「”golang” image boundsとは」でググって](https://www.google.com/search?q=%22golang%22+image+bounds%E3%81%A8%E3%81%AF)も何かよくわからなかったり、Go v1.16 系では動かなかったので、自分のググラビリティとして。
## TL; DR (今北産業)
1. `Bounds()` の `Bound` は「境界」や「隣接する範囲」などの意味。
日本語で言う**「バウンド」の「跳ね返る」ではありませ
Goのインストールとチュートリアルメモ
Go使ったことない人間がGoのインストールしてから[公式](https://golang.org/doc/install)のチュートリアル進めて行くにあたって躓いた点などをメモ。
なおMac前提。(随時追記)# インストール
* [公式](https://golang.org/doc/install)から最新版をダウンロードしてインストールする
* よくわからんけどgoコマンドが `command not found` になってしまうっ……!ってなったので、~/.bash_profileをいじいじしてパスを通す。“`~/.bash_profile
# goのインストール先は/usr/local/goになる
export PATH=”/usr/local/go/bin:$PATH”
“`そんでもってターミナル再起動かsourceで再読み込み
“`
$ source ~/.bash_profile
“`これでようやくgoコマンドが動いた
“`
$ go version
go version go1.16.6 darwin/amd64
“``$GOPAT
【Golang】TinyGo で WebAssembly.instantiate(): Import #0 module=”wasi_snapshot_preview1″ error: module is not an object or function
Docker の TinyGo で疲労コンパイる
> TinyGo の Docker イメージ `tinygo/tinygo:latest` で `wasm`(WebAssembly のバイナリ)をビルドして実行したら、”`wasi_snapshot_preview1`” エラーがブラウザのデベロッパーツールのコンソールに表示される。
>
> “`text:consoleログ
> WebAssembly.instantiate(): Import #0 module=”wasi_snapshot_preview1″ error: module is not an object or function
> “``wasi_snapshot_preview1` モジュールがないのはわかるのですが、よくわりません。でも Go で `wasm` をコンパイルすると動くんです。
[「`WebAssembly.instantiate(): Import #0 module= “wasi_snapshot_preview1” error: module is not a
Goの静的解析ツールを作成した
はじめまして、[しぶちゃり](https://twitter.com/sivchari)です。
今回はGoの静的解析ツール `nilassign` の紹介をさせていただきます。## nilに代入することで発生するpanic
Cをはじめとしたポインタの概念が存在する言語ではnullにデータを渡すことで言語ごとにエラーが発生します。これはデータを代入するアドレスが存在しない(null)にも関わらず利用するためです。
その例に漏れず、Goのnull型に相当するnilも、データを渡したり、参照することでエラーが発生します。以下がその例です。“`go
package mainimport (
“fmt”
)func main() {
var i *int
*i = 1
fmt.Println(i)
}
“`
[The Go Playground](https://play.golang.org/p/mNpu9IZgAOn)“`console
panic: runtime error: invalid memory address or nil pointer
excelizeをgo installするとエラー
### excelizeをインストールする際に下記のエラー
**ラスト2行を訳すと`github.com/xuri/excelize/v2`のパスが必要だけど、`github.com/360EntSecGroup-Skylar/excelize/v2`が宣言されているよ**とのこと
ついこの間まで使えていたので、なんか変更が入ったみたいですね“`console
$ go install github.com/360EntSecGroup-Skylar/excelize/v2
go: finding module for package github.com/360EntSecGroup-Skylar/excelize/v2
go: downloading github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.1
go: found github.com/360EntSecGroup-Skylar/excelize/v2 in github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.1
go:
Go言語とGASで翻訳デスクトップAppを10分で作る。
#はじめに
Go言語を少しだけ触って簡単な翻訳appを作成したので備忘録
コードは[こちら](https://github.com/Gyabi/go-translateApp)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532027/67c2aecb-11fc-c026-316c-ffe4c5a3a024.png)#システム構成
OS:Windows10
GUIの記述:Go言語(Walk)
翻訳APIの記述:GASGo言語のwindowsデスクトップapp作成用ライブラリの[Walk](https://github.com/lxn/walk)を用い簡単なGUIを作成。
また、GASを用いてgoogleのサーバ上に翻訳APIを作成。
あとはGUIの操作に合わせてPOSTを投げてレスポンスを表示させるだけ。超手抜き。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153202
JSON-TO-GO を使えば、GO 構造体定義がすこぶる簡単!
## Teratail の質問 API
プログラミングに関する質問ができる Teratail では、API を提供しています。
https://teratailv1.docs.apiary.io/#reference/(question)/0/0
質問一覧では、下記のようなレスポンスが返ってくるとのことです。
これを一つ一つ Go の構造体を作成するのは結構時間がかかる。。
“`json
{
“meta”: {
“message”: “success”,
“total_page”: 1,
“page”: 1,
“limit”: 10,
“hit_num”: 2
},
“questions”: [
{
“id”: 10364,
“title”: “インデントにタブを使うことのデメリット”,
“created”: “2015-05-27 04:49:55”,
“modified”: “2015-06-22 15:17:06”,
“count_reply”:
[Go Snippet] “RANDOM USER GENERATOR” からの JSON を Unmarshal する
## 概要
[Random User Generator](https://randomuser.me/) というサイトで、ランダムなユーザー情報を取得できる JSON の API を提供している。早速使ってみる。
[API はこの URL (https://randomuser.me/api)](https://randomuser.me/api) からアクセスできる。
## Unmarshal したい JSON の構造を調べる
“`json
{
“location”: {
“street”: “9278 new road”,
“city”: “kilcoole”,
“state”: “waterford”,
“postcode”: “93027”,
“coordinates”: {
“latitude”: “20.9267”,
“longitude”: “-7.9310”
}
}
}
“`この構造は、こう
gomockで同一メソッドを複数回呼び出す際のレスポンスを変える
## 背景
最近Goでテストを書く際、mockingフレームワークは [golang/mock (通称gomock) ](https://github.com/golang/mock)を使用し始めました。
スタブとして同一メソッドを複数回呼び出す際に、呼び出しごとにレスポンスを変える方法を調べたので、tipsとしてまとめておきます。以下で使用するサンプルコードは、次のようなディレクトリ構成を想定します。
“`
animal/
├ dog.go
├ dog_mock.go
└ dog_test.go
“`簡単のためmockコードは省略しますが、`go generate ./…`で作成する想定でサンプルコードに`go:generate mockgen`を埋め込んでいます。
## 2回目レスポンスを変える その1 ~引数なし~
### アプリケーションコード
こちらは`Bark()`メソッドを持つ`Barker`インタフェースを実装した`Dog`という構造体を表現しています。
`Run()`メソッドのテスト時に`Barker.Bark()`をスタブとして
Firestoreをgoの構造体で扱う
## 概要
GoでFirestoreを扱う際に、構造体を利用したかったのだがその取扱いについて詳細な記載がなかったのでいろいろと試してみました。ただし今回の記事は、調査するための基盤づくりとしての要素が強いので調査内容自体は簡易的なものです。自身のユースケースに合わせて今後も調査できればと思います。
ちなみに今回は、構造体内でポインタを使った際の動作について検証しました。
(ある程度Firestoreの操作を知っている人向けになってしまうことをお許しください)
## 始めるにあたって
PlayGroundで動作可能な範疇を超えていたのでGithubで[レポジトリ](https://github.com/handball811/firestore-testing)を作成しました。簡単な使い方を紹介していたりしていますが、調査が目的なため殴り書きです。悪しからず。## 調査内容
概要でも示した通り、Firestoreでドキュメントを作成する際や取得する際にどのような構造体であれば、なんのデータが得られるのかを確認してみました。具体的には以下のようなケースです。(今回の検証
Go言語 基礎文法
## 目次
1. [Go言語とは?](#1go言語とは)
1. [基本文法](#2基本文法)
1. [演算子とデータ型](#3演算子とデータ型)
1. [制御文](#4制御文)
1. [関数](#5関数)
1. [メソッドとインタフェース](#6メソッドとインタフェース)
1. [並行処理](#7並行処理)## 1.Go言語とは?
* Googleが2009年に公開した静的型付け言語
* 文法がシンプル
* 並行処理が得意
* 実行速度が早い### 公式サービス
[Go Playground](https://play.golang.org/)
ブラウザ上でGo言語のソースコードを実行する環境を提供している
また、ソースコードのシェアやフォーマットが可能。[A Tour of Go](https://tour.golang.org/)
チュートリアル形式でGo言語の一通りの文法を学ぶことができる### コンパイル・実行方法
“`ssh
# コンパイル
go build hello.go
# exeファイルが作成されるので、あとはそれを叩けばよい# ビルドと実行を
Go言語豆知識(一)
###豆知識###
Go言語には、スライスという概念があります。スライスは値型ではなく、参照型のデータです。スライスは値型のArrayを参照しています。
スライスを拡張するにはappendメッソドを使います。もしスライスを拡張するときに、元に参照するArrayの長さを超えた場合は、新しい参照元Arrayを再作りすることになります。###コード###
“`golang
slice1 := []int{1,2,3,4}
slice2 := slice1[:3]fmt.Println(“最初の段階、slice1,slice2はおなじ参照元Arrayを参照しています”)
fmt.Println(slice1)
fmt.Println(slice2)fmt.Println(&slice1[0])
fmt.Println(&slice2[0])
fmt.Println()fmt.Println(“slice2の長さはまた参照元Arrayの長さを超えていない”)
slice2 = append(slice2, 15)fmt.Println(slice1)
Go 1.15 で GAE 独自 API を利用できるのか?
GAE には便利な独自 API が用意されていたものの、第 2 世代と呼ばれる環境ではサポートされなくなってしまいました。 [^1] [^2]
このことは GAE/Go 利用者が Go 1.11 を使い続ける大きな理由だと思います。しかし先日リリースされた [golang/appengine](https://github.com/golang/appengine) v2.0.0-rc2 で Go 1.12 以降がサポートされました。
https://github.com/golang/appengine/releases/tag/v2.0.0-rc2
> Clean up interfaces for legacy APIs that will be supported for Go 1.12+
まだ RC ですが Go 1.11 では動かないライブラリも増えている昨今ですので新しいバージョンの Go に移行できるというのはとても魅力的です。
そこで現在のバージョン (v1.6.7) とどのような違いがあるのか調べてみました。なお、特に記載がない限り 2021 年 7
golangメモ
# 開発環境作成
バージョン
go version go1.16.5 linux/amd64一回目に起動する
“`
docker run -it –workdir /working -v $PWD:/working golang bash
“`2回目に起動する
“`
docker start golang -i
“`#プロジェクトの初期化
“`
go mod init sample
“`#実行ファイルの作成
“`sample.go
package mainimport (
“fmt”
“os”
“time”“github.com/mmcdole/gofeed”
)func main() {
feed, err := gofeed.NewParser().ParseURL(“https://zenn.dev/spiegel/feed”)
if err != nil {
fmt.Fprintln(os.Stderr, err)
retur
【小ネタ】Windows環境でgo get がプロキシの関係で入らないとき
# はじめに
つまづいたのでメモ
## Vesrion
go version go1.14.4 windows/386
## 何が起きたか
プロキシ環境下で go getするとうまくいかない。
> A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
Git の設定やVisualStudioCodeの設定を見直してもうまくいかない。
## どうしたか
コマンドプロンプトを開いて以下の環境変数を宣言
“`
SET http_proxy=プロキシURL:ポート番号
SET https_proxy=%http_proxy%
“`そして、go get
“`
$ go get -v github.com/labstack/echo
go: downloa
ブラウザをターミナル代わりにするrttyを作った
## 初めに
以前にブラウザからターミナルを操作したくて、周りの方に聞いたら[Secure Shell App](https://chrome.google.com/webstore/detail/secure-shell-app/pnhechapfaindjhompbnflcldabbghjo?hl=ja)を教えていただいたんですが、なぜか自分の環境ではうまく動作しませんでした。
他にも似たようなことができるツールはありましたが、メンテナンスがされていなかったりビルドもインストールできなかったりして使えなかったので、自作しました。https://github.com/skanehira/rtty
しくみ自体はイメージできていたので、そんなに難しくないだろうと思っていましたが、意外と罠があってそれを解決するのに時間がかかってしまいました。
## `rtty`の概要と使い方
`rtty`はプロセスの入出力を`websocket`を通して、ブラウザでターミナルのような操作を可能にするCLIです。
簡単にいうとブラウザがターミナル代わりになる、という感じです。“`
+—–
Go言語を簡単に勉強して思う、言語設計の違いについて
# GOを簡単に勉強して思う、言語設計の違いについて
## はじめに
この記事は、かる〜〜くGOに触り始めたpython使いが思ったことを書いた記事です。
歴戦のGO使いの方々がご覧になられ「それ、お前が知らないだけだわ」と思った場合、コメントいただけますと大変助かります(できれば、石と匙は投げないでね)## Goを触る動機
### CとPythonに対するほんの小さな不満
CとPythonは言語として使える(≠使いこなしている)状態の僕ですが、以下の様なほんの小さな不満がありました。* C: 手が遅い僕からすると、開発工数がちょっと重い
* Python: さっとかけるけど、他の人・環境へのリリースしにくい
* ①バイナリ形式でリリースしたい(ソースコード出したくない)
* ②リリース後の環境影響を受けたくないPythonの方だけ補足すると、①②ともにPyinstallerで一応は解決出来ます。
が、Pyinstaller はバイナリからソースコードへの逆変換自体が出来てしまいます。厳密にいうと、①で本当にやりたい「ソースコードを隠したい」