Go関連のことを調べてみた2021年08月02日

Go関連のことを調べてみた2021年08月02日

Goの静的解析ツールを作成した

はじめまして、[しぶちゃり](https://twitter.com/sivchari)です。
今回はGoの静的解析ツール `nilassign` の紹介をさせていただきます。

## nilに代入することで発生するpanic

Cをはじめとしたポインタの概念が存在する言語ではnullにデータを渡すことで言語ごとにエラーが発生します。これはデータを代入するアドレスが存在しない(null)にも関わらず利用するためです。
その例に漏れず、Goのnull型に相当するnilも、データを渡したり、参照することでエラーが発生します。以下がその例です。

“`go
package main

import (
“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:

元記事を表示

自分が作ったアプリのアカウントにアイコン機能を追加した。(Echo,Gorm)

#はじめに
アカウントにアイコン機能(プロフィール画像を表示させるもの)を作ろうとしたときに少しハマったので
#この記事で説明すること
フロントエンド側
・画像の選択
・選択した画像をfetchのPOSTメソッドで送る
バックエンド側
・送られてきた画像を受け取る
・画像をローカルに保存する
・画像のパスをアカウントと紐づけする

#フロントエンド側
画像の選択

“`react:icon.tsx
const [view, setview] = useState();
const [iconData, setIconData] = useState();
const onFileInputChange = (e: React.ChangeEvent) => {
setview(window.URL.createObjectURL(e.target.files[0]))
const image = new FormData()
image.append(“file”, e.target.files[0]

元記事を表示

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の記述:GAS

Go言語の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 smple
“`

#実行ファイルの作成

“`sample.go
package main

import (
“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)
return

元記事を表示

【小ネタ】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 はバイナリからソースコードへの逆変換自体が出来てしまいます。厳密にいうと、①で本当にやりたい「ソースコードを隠したい」

元記事を表示

AtCoder Regular Contest 124 解説

# 感想

50分遅れて参加したら、WAが出るわ焦るわで散々な目に遭いました。南無三。

下記ではC問題までを解説しています。D問題以降は解くつもりがありません。

# [A問題](https://atcoder.jp/contests/arc124/tasks/arc124_a)

(以下では、簡略化のために「最も左」の条件があるマスを`マスL`、「最も右」の条件があるマスを`マスR`、とします。)

マスの間に依存関係はないので、それぞれのマスでありうる数の個数をかけ算すれば答え(`ans`を`998244353`で割った余り)が求まります。

まず、`マスL`または`マスR`となるマスを考えます。この時、複数の条件が被っているマスは、どの数をそのマスに選んでもいずれかの条件を満たさないので0通りです。よって、それぞれのマスに高々一つの条件がある場合を以降では考えます。

まず、条件のあるマスは自明に1通りなので、`ans`に1をかけます。次に、条件のないマスがそれぞれ何通りの数を選べるかを考えます。この時、問題の条件より、「そのマスよりも左側に`マスL`がある」or「そのマスよ

元記事を表示

Go言語のチュートリアルをやってみた。ついでにまとめて日本語化した。

#はじめに
Go言語をさわりたくてチュートリアルをやりましたが、全部英語でした。
せっかくなので日本語版を作りました。
内容はほぼ一緒(なはず)で、最低限これでわかるであろうの感覚で書いたので
端折ってるところは多々ありますが参考になればうれしいです。

#環境
– Windows10
– visual studio code
– Go言語バージョン 1.16.6 (現時点で最新)

#Go言語をインストール
[ここからインストール](https://golang.org/doc/install)

インストールが終わるとgoコマンドが打てるようになる。

#チュートリアル:Goを使い始める(Tutorial: Get started with Go)をやってみる
[チュートリアル:Goを使い始める](https://golang.org/doc/tutorial/create-module)

任意のディレクトリを作る。
→デスクトップにgo/helloというフォルダを作成

VScodeのターミナルでモジュールを初期化する。
go mod initで行うが、最初はこれをやるというお

元記事を表示

Amazon ComprehendをAWS SDK for Go v2を使って呼び出す

# はじめに

[AWS SDK for Go](https://aws.amazon.com/jp/sdk-for-go/)がありますが、現在(2021年7月24日)のところ、AWS SDK for Go **v2**のAmazon Comporehendのコードサンプルがなかったので、とりあえず自分で作ってみることにしました。
個人的にはPythonを使用することが多いのですが、Go言語も業務で使用することがあるので、Go言語でもチャレンジしてみました。
※他の言語や他のサービスのコードサンプルは以下から参照できます。

* [Developer Guide/Code Examples](https://aws.github.io/aws-sdk-go-v2/docs/code-examples/)
* [awsdocs/aws-doc-sdk-examples](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/gov2)

# Amazon Comprehendを使用するための事前準備

Go言語のプログラム

元記事を表示

GolangでFirebaseのFirestore Databaseを使う

# はじめに

FirebaseのFirestore Databaseに、GolangのSDKを用いて接続したい。

[公式Doc](https://firebase.google.com/docs/firestore/quickstart?hl=ja)を参考にFirestoreへの接続を試みたところ、以下のように「ファイルが見つからない」と怒られたので、その解決策を備忘録として残す。

“`
Init Firestore failed. err=cannot read credentials file: open ./firebase-adminsdk-key.json: no such file or directory”
“`

ちなみに、解決方法をググると、GOPATHまわりを良い感じに変更する方法がたくさん出てくるが、よくわからなかったので、本記事では別の方法を採用している。
(一応、記事後半に採用理由も記載済み)

# 失敗パターン

プログラム自体は概ねこれで問題ない

“`golang
// このpackageはあくまで筆者の環境
package infrastr

元記事を表示

[Go Snippet] マルチプレクサをざっくり

## 自作で ServeHTTP を実装

`http.Handler` は、`ServeHTTP` を実装すれば OK。
([詳しくは「Golang での Web アプリ開発で、理解を早める 5 ステップ」をチェック](https://qiita.com/yNavS4Ki/items/5b7a0c7c41eb8da8f12a))

“`go:maing.go
package main

import (
“fmt”
“math/rand”
“net/http”
)

type MyServeMux struct {
}

// ServeHTTP を implement
func (p *MyServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == “/” {
fmt.Fprint(w, “hello, world!\n”)
return
}
if r.URL.Path == “/randomInt” {
fmt.Fprintf(w, “Random num

元記事を表示

OTHERカテゴリの最新記事