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

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

【Go】構造体サンプルメモ

## サンプル

“`go
package main

import (
“fmt”
“encoding/json”
)

func main() {
type location struct {
Name string
Lat float64
Long float64
}

// JSON 変換するためにキーを大文字にしておく必要がある
locations := []location {
{Name: “Brandbury Landing”, Lat: -4.5895, Long: 137.4417},
{Name: “Columbia Memorial Station”, Lat: -14.56684, Long: 175.472636},
{Name: “Challenger Memorial Station”, Lat: -1.9462, Long: 354.4734},
}

// [{Brandbury Landing -4.5895 137.4417} {Columbia Memorial Station -14.56684 17

元記事を表示

良さげなクロスプラットフォーム開発言語《v》のメモ(Go,Nim,Rustと少し比較)

# 序
GoとNimは趣味でそれなりに触って、Rustは仕事にならない限り触らないことにしている自分が、v言語をチラ見してみたのでメモを残しておく。 バージョン0.1台とまだまだ若い言語なので参考程度に。
v言語:
https://vlang.io/

cf.なるほど。
[Rustを業務で1年使ってみてわかったこと](https://qiita.com/AtsukiTak/items/0ecba19f3518c23d2bf3)

# v言語を三行で
– v言語はGoをリスペクトしてる型あり言語。もともとvはGoで書かれていた。
– Nimと同様にC言語をバックエンドとしてバイナリ化する。vは、Nim並みにコンパイルは早くバイナリサイズは小さく。
– Rustとは異なり言語仕様はシンプルに。モダンなところはRustにも学ぶ(関数定義はfuncではなくfnだし…)。

# v言語の使い所、思ったところを三行で
– 公式サイトとしては、v言語をクロスプラットフォームなクライアント側のアプリ作りに使って欲しい模様。出自からも当座はクライアント側一択か。
– 実用するには、C/C++(/ob

元記事を表示

【Go】マップサンプルメモ

## サンプル

“`go
package main

import (
“fmt”
)

func main() {
mapTest := make(map[string]int)

mapTest[“a”] = 1
mapTest[“b”] = 2

fmt.Println(mapTest[“a”]) // 1
fmt.Println(mapTest) // map[a:1 b:2]
fmt.Println(mapTest[“c”]) // 0 — > 存在しないキーのときは値の型のゼロ値が返る

for k, v := range mapTest {
fmt.Println(k, v) // a 1
}

// 存在チェック
// マップ内に指定のキーに対する値が存在しているかは、戻り値を2つ受けて、2番目の戻り値で判断することができる
// https://blog.y-yuki.net/entry/2017/04/26/000000
_, ok := mapTest[“a”]
fmt.Println(ok) // true

_, ok

元記事を表示

Go + Fyne で GUI アプリケーション

Go の GUI ライブラリである Fyne について雑多にあれこれ紹介します.

# Fyne とは

Fyne は Go で GUI アプリケーションを作るためのライブラリです.
シンプルでわかりやすい, 簡単に綺麗なデザインが作れる, モバイル等も含めたクロスプラットフォームといった点を売りとしています.

– 公式サイト
– https://fyne.io/
– GitHub リポジトリ
– https://github.com/fyne-io/fyne

## 基本

インストール 〜 Hello world までは他の方が書いたいくつかの記事があるのでそちらを参照してください.

https://qiita.com/KanikoroRerere/items/e2dcc44e625849526015
https

元記事を表示

python初心者がIT企業にインターンしてみた[3日目 雲行きが・・・]

昨日疲れすぎて投稿できんやったから今日投稿する

#衝撃の事実
今日も元気よく出勤。今日の昼飯は俺の好きなカレーパンだ。なんて呟いているおじさんを横目に、コーヒーを購入(俺かと思ったか)。
それはさておき、いつも通り朝の打ち合わせがあったが、そこでまさかの事実を聞かされる。「来週までに企画提案書を提出してね。あとその企画をクライアントにプレゼンしてもらうからよろしく。」
What a fork!!!(good placeより引用)

##AIをつかったチャットボット 開発?
打ち合わせで企画をプレゼンすることになったのだが、その内容はAIを使ったチャットボット。それを聞かされて一日が始まったわけだが、何もわからないためまずチャットボットサービスの比較表を作った。会社にデータがあるため載せられないけど、軽く紹介しよう。

###チャットボットとは?
チャットボットは人間が入力するテキストや音声に対して、自動的に回答を行うことで、これまで人間が対応していた「お問い合わせ対応」「注文対応」などの作業を代行することができる。(まるまるコピー)
https://ferret-plus.com/8

元記事を表示

[geth改造]トランザクションが送られてきた時だけブロックを生成する

# 記事の内容
自分で勉強している時に空ブロックが大量に作られるのが煩わしかったので、トランザクションが送られてきた時だけブロックを生成するように改造しました。

# 環境
geth:v1.9.8-stable
golang:1.13.3

# gethのclone
今回使用したgethをcloneしてきます。
※当記事執筆時点ではmasterからダウンロードすると「unstable」のバージョンが落ちてきたので、安定版を指定して落としています。

“`
git clone -b v1.9.8 https://github.com/ethereum/go-ethereum.git
“`

# コードの修正(miner/worker.go)
該当のコードを修正します。
修正ソースは「miner/worker.go」の547行目から始まる「resultLoop」関数です。
まずは修正前のコードです。

“` miner/worker.go
// resultLoop is a standalone goroutine to handle sealing result submitti

元記事を表示

Goroutineを雑多にまとめる

Goroutineの文法を自分用メモとしてまとめる。

# sync.WaitGroup

複数のスレッドで並列処理を行う際、その全ての完了を確認するために使用できる。WaitGroupのカウンタを用いる。(Javaのjava.util.concurrent.CountDownLatchによく似ているらしい)

“`
// WaitGroupの値を作る
wg := &sync.WaitGroup{}

// wgのカウントをインクリメント
wg.Add(1)
go func(wg *sync.WaitGroup) {
// wgのカウントをデクリメント
defer wg.Done()
処理
}
// カウントが0なら次に進める
wg.Wait()
処理
“`

[注意] `Addされるカウントの合計 = Done()の合計個数`である必要あり

# チャネル
* 中身の個数が決まってるのが`bufferred channel`、決まっていないのが`unbufferred channel`。

“`
// チャネルの作成
ch = make(chan in

元記事を表示

seek難しい

こんなコードを書くとzipファイルがおかしいとなったのでメモ

“`
target, err := ioutil.TempFile(“”, “zip”)
if err != nil {
sentry.CaptureException(err)
log.Fatalln(err)
}
w := zip.NewWriter(target)
defer w.Close()
for _, client := range clients {
xlsx, err := run(client.ClientID)
if err != nil {
continue
}
defer xlsx.Close()
f, err := w.Create(fmt.Sprintf(“%d_item_error.xlsx”, client.ClientID))
if err != nil {
sentry.CaptureException(err)
log.Fatalln(err)
}
if _, err :=

元記事を表示

package main

func main() {
http.HandleFunc(“/”, func(w http.ResponseWriter, r *http.Request) {
w.Write(“森っている”)
})

log.Faltal(http.ListenAnd(“:8080”, nil))
}

元記事を表示

Go(golang)/ginのAPIでnullableなjsonを返す

#状況
– 当たり前の機能だと思うかもしれないが少しハマった。
– [golangの仕様で変数にnullを代入できない。例えば`int`型であれば初期化した時点で0の値が初期値として設定される。](https://qiita.com/tenntenn/items/c55095585af64ca28ab5)

“`
var n int
println(n)

// 実行結果
0
“`
– これでどういう問題が発生するかというと構造体でも初期化した時点で勝手に0が入ってしまいnull値を表現できない。
– すると`gin`の`context`を使ってjson化した際にも、もちろんnull値が入らない。
***jsonでnullが返せない!***

“`
package main

import (
“time”

“github.com/gin-gonic/gin”
)

func main() {
r := gin.Default()
r.GET(“/”, func(c *gin.Context

元記事を表示

iPhoneやiPadのアプリで無料で広告ブロックする方法

#参考にした記事

iPhoneのアプリで無料で「広告」を「消す」方法 ( 広告 ブロック iPhone iPad アプリ)
広告 ブロック iPhone LINE spotify スマートニュース グノシー うざい 消し方 多い 消す ios ipad みんはや ゲーム 広告消す chrome

# ブロックにはDNScloakというアプリを用います

https://github.com/s-s/dnscloak

https://github.com/DNSCrypt/dnscrypt-proxy

DNS cloakはgo製の dnscrypt2のラッパー。(どちらもOSSです)

ローカルにDNSサーバーを立てて、フィルターにリスト化された広告サーバーのURLのリクエストを返さないことで広告を遮断します。

アプリで流れる動画広告などは完全に遮断することができます。

広告のあった場所は空白になります。(空白の部分がないように整形してhtmlを返すことも技術的には可

元記事を表示

GoとMongoDBとProtocol Buffersでの小数の扱い

MongoDB上で[`NumberDecimal()`](https://docs.mongodb.com/manual/core/shell-types/#numberdecimal)を使い`decimal`で小数を格納していたのだが、それを[“mongo-go-driver”](https://github.com/mongodb/mongo-go-driver)を介して`Decode()`する時に、`cannot decode 128-bit decimal into a float32 or float64 type`とエラーが出て困ったので、各々の小数周りの仕様を調べた。

それぞれの小数周りの仕様へのリンク集としても役立つはず。

## Go

Go上で小数に対応する型は、[Numeric typesの仕様](https://golang.org/ref/spec#Numeric_types)によると、`float32`と`float64`のよう。

## Protocol Buffers
“proto3″のLanguage Guideにある[Scalar Values T

元記事を表示

Golang vs. Python – Is Golang Better Than Python?

In this tutorial we are going to make the comparison between Golang or Python, you will have the complete idea at the end of this tutorial which programming language between Python or Goland you should opt for your next software development project.

click here to read more

Golang vs. Python – Is Golang Better Than Python?

元記事を表示

【Hyperledger Fabric v2.0】PrivateDataを使ってみよう

# はじめに
あけましておめでとうございます(ぇ
どーも、のぶこふです。

## ICE BREAK

日本時間 2020/01/30(木)7:00頃 に HLF v2.0 が正式リリースされましたね。
私はGithubに張り付いていたのでリリースされた瞬間にTwitterで発信しましたが、
いかんせん私のフォロワーが少ないので、拡散するには力が及びませんでした。

とまぁ、そんなことは置いておいて、
HLF v2.0 の目玉機能といえば
「Private Data」ですね(たぶん
※どんな変更点があるか等は、他の方がまとめてくださっているので、
 そちらをご参考願います。ワタシ エイゴ シャベレマセーン
 ▼コチラとか
 https://gakumura.hatenablog.com/entry/2020/01/30/180540

「おいおい、のぶこふさんよぉ。Private Dataなら、昔からあったぜぇ?」
はい、そうです。ありました。
なんなら、使い方をまとめた記事も書きました。

▼【Hyperledger Fabric】PrivateDataを使ってみよう
https

元記事を表示

Go言語でnewとmakeを使ってみた

##はじめに
Go言語でnewとmakeを使い、違いを備忘のために記します。

##環境
macOS Catalina 10.15.3
go1.13.3 darwin/amd64

##1. makeを使う
以下はmakeを使用して、変数を初期化する例です。コードは一部抜粋します。

“`sample.go
s := make([]int, 0)
m := make(map[string]int)
ch := make(chan int)

fmt.Printf(“%T\n”, s)
fmt.Printf(“%T\n”, m)
fmt.Printf(“%T\n”, ch)
“`

###[出力結果]
“`
[]int
map[string]int
chan int
“`

##2. newを使う
以下はnewを使用して、変数を初期化する例です。コードは一部抜粋します。

“`sample.go
var p *string = new(string)
var str = new(struct{})

fmt.Printf(“%T\n”, p)
fmt.Printf(“%T\n”

元記事を表示

アプリ実装者のためのGo1.13からのエラーとの付き合い方

# はじめに

[Go1.13から機能追加されたエラー](https://golang.org/doc/go1.13#error_wrapping)に関してキャッチアップがまだできていないアプリケーション開発者のための記事です。

# TL;DR

アプリケーション実装者は以下をすることで嬉しさを得られます。

* `fmt.Errorf(“%w”, err)` または `Unwrap() error`を実装したエラー型をカスタムエラーにする。
* `errors.Is`関数、`errors.As`関数を使いエラーハンドリングの受け口を実装する。

Go1.12までのバージョンとの実装方法の比較は[Go 1.13時代のエラー実装者のお作法](https://qiita.com/shibukawa/items/e633e426a6e67ea2e830)の記事が非常に参考になります。

### 環境

“`
$ go version
go version go1.13.1 darwin/amd64
“`

# ライブラリが提供するエラーとの付き合い方

## ライブラリが返すエラー値

元記事を表示

【Go】配列のサンプルメモ

“`go
package main

import (
“fmt”
)

func main() {
// 配列の型
// [長さ] 要素型
// [長さ] 要素型 {要素の初期値..}

// 配列の宣言
var arr1 [2]string
arr1[0] = “a”
arr1[1] = “b”
fmt.Println(arr1)

// 配列初期化
arr2 := [2]string{“a”, “b”}
fmt.Println(arr2)

// https://yttm-work.jp/lang/go/go_0005.html#head_line_03
var arr3 [2]string = [2]string{“a”, “b”}
fmt.Println(arr3)

// 初期値で指定した要素の数が自動的に長さとなる
arr4 := […]string{“a”, “b”}
fmt.Println(arr4)
}
“`

元記事を表示

【Go】スライスのサンプルメモ

“`go
package main

import “fmt”

func main() {
// 配列
arr := [3]string{“a”, “b”, “c”}

// スライス型の変数を宣言
var s1 []string
// スライス
s1 = arr[:]
fmt.Println(s1) // [a b c]

// var を使わないVersion
s2 := arr[:]
fmt.Println(s2) // [a b c]

// インデックスを指定
s3 := arr[1:2]
fmt.Println(s3) // [b c]

s4 := arr[1:3]
fmt.Println(s4) // [b c]

// append
s5 := append(s4, “d”, “e”)
fmt.Println(s4) // [b c]
fmt.Println(s5) // [b c d e]

// 配列とスライスを同時に宣言
s6 := []string{“A”, “B”, “C”}
fmt.Println(s6)

元記事を表示

Go + echo + Docker + VSCode + Remote Containers で開発環境の構築 (ホットリロードとステップ実行対応)

## 背景
– Go + echo で api サーバーを実装するにあたり開発環境を構築した際のメモ。
– Docker で動かしたい。
– VSCode の Remote Containers を試したい。
– ホットリロード欲しい。
– ステップ実行したい。

## 成果物
– https://github.com/f-sugar/golang-docker

## ホスト
– Docker 19.03.1
– docker-compose 1.24.1
– VSCode 1.42.0
– ms-vscode-remote.remote-containers 0.101.0

## コンテナ内
– go 1.13.7
– realize 2.1
– delve 1.4.0
– echo 4.1.14

## Dockerfile + docker-compose.yml 作成
“`Dockerfile:Dockerfile
FROM golang:1.13.7

WORKDIR /go/src/app

ENV GO111MODULE=on
ENV GOPATH /go

元記事を表示

Mac環境でgodocをインストールできなかった時にしたこと

以下コマンドでgodocをインストールしようとしたら

“`go
go get golang.org/x/tools/cmd/godoc
“`

`operation not permitted`が表示され、インストールできない。。。

[stackoverflowに似た現象](https://stackoverflow.com/questions/48617574/go-install-command-results-in-open-bin-palindrome-operation-not-permitted-in-m)に遭遇した人が。

以下手順で解決した。

“`
brew install go
mkdir Go
cd Go && mkdir bin pkg src
“`

元記事を表示

OTHERカテゴリの最新記事