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

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

Golangの構造体(struct)の基礎

#Golangの構造体(struct)の基礎
エンジニアになりたての雑魚エンジニアがGolangを学習した忘備録的な記事なので、
間違い等があったら、優しく指摘してもらえるとありがたいです。

参照 スターティングGo言語

##構造体(struct)とは?
複数の任意の型の値を一つにまとめたものである。
基本型、配列型、関数型、参照型、ポインタ型などの様々なデータ構造を持つ型を1つの型として取り扱うことが可能となる。

“`.go
struct {
//ここに任意の変数名 型を定義していく
Name string
Age int
}
//また個々のデータをフィールドと呼ぶ
//struct { [フィールドの定義] }
“`
構造体に入る前に・・・type!

##型から新しい型を定義するtype
typeとは既にある型をもとに新しい型を定義するための機能である。
これによってエイリアス(別名)を定義することができる。
しかし、あくまで既存の型から新しい型を定義している為、型の互換性は気をつけなければならない。

“`.go
type MyInt int
//これで、in

元記事を表示

[Go] golang.org/x/time/rate でレイトリミット

レイトリミットを実装するために `golang.org/x/time/rate` を採用したものの、しばらく経ってから見返すとその仕様を完全に忘れていてショックだったので、こちらに記事として備忘録的に要点をまとめていきたいと思います。

## トークンバケット

`golang.org/x/time/rate` は「トークンバケット」というアルゴリズムを Go で実装したパッケージになります。
このパッケージは一見すると使い方が分かりづらいのですが、「トークンバケット」を理解すると合点がいくデザインとなっているので、まずはこちらを理解しましょう。

一応 Wikipedia にもページがあるのですが([トークンバケット – Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%83%90%E3%82%B1%E3%83%83%E3%83%88))、`golang.org/x/time/rate` パッケージのドキュメントを読むのが端的で分かりやすいと個人的には思いました。`Limi

元記事を表示

更好用的 Web 服务器:Caddy

>![](https://upload-images.jianshu.io/upload_images/47789-460551236cb790d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

双 11 买了一台阿里云vps ,新vps当然要用新工具武装下。

## What is Caddy

[Caddy](https://caddyserver.com/) 首先是一个用Go实现的Web Server。

在追求性能的道路上,nginx已经一骑绝尘。这种情况下诞生的 Gaddy有什么特性呢?

Caddy的作者Matt Holt有这样的理念: 其他Web Server为Web而设计,Caddy为human设计。一句话就是 Caddy主打易用性,使用配置简单。

Caddy有下面这些开箱即用的特性:

– 全自动支持HTTP/2协议,无需任何配置。
– Caddy 使用 Let’s Encrypt 让你的站点全自动变成HTTPS,无需任何配置。
– 合理使用多核多核 得益于go的特性
– 完全支持IPv6环境

元記事を表示

今更のWasm入門 with Go

# やったこと
WebAssembly(Wasm:ワズム)を全く理解してなかったので、諸々調べたりするとともに、[Go(TinyGo)](https://github.com/tinygo-org/tinygo)を使って軽く動かしてみました。
目次はこんな感じです。

– Wasmの概要とか、調査したこと
– TinyGoについて
– Javascriptと連携してブラウザ上で「Hello, Wasm!」
– WASIランタイム(wasmtime)を使って「Hello, Wasm!」

※ 個人的な備忘録であるためもし何か誤り等ございましたらご指摘いただけますと嬉しいです?‍♂️

# Wasmとは何か
[MDNの説明](https://developer.mozilla.org/ja/docs/WebAssembly)が分かりやすいかなと思います。

>WebAssembly はモダンなウェブブラウザーで実行できる新しいタイプのコードです。ネイティブに近いパフォーマンスで動作するコンパクトなバイナリー形式の低レベルなアセンブリ風言語です。さらに、 C/C++ や Rust のような言

元記事を表示

sort.SearchStrings の注意点と対策コード

## 記事の概要

文字列を二分探索する関数 sort.SearchStrings は、その返り値では、
探索対象の文字列が存在するか、存在しないかが判断できない。
その説明と対策コードを考え、書いた。

## 参考文献
https://golang.org/pkg/sort/#SearchStrings
https://golang.org/src/sort/search.go?s=3680:3724#L91

## sort.SearchStrings の仕様

sort.SearchStrings は 公式ドキュメントによると、
昇順にソートされた文字列スライスと文字列xを受け取り、スライスの中にxがあるか二分探索する。
文字列スライスの中にxが存在する場合, そのインデックスを返し、
文字列スライスの中にxが存在しない場合、そのスライスに、昇順を維持して、xを挿入するためのインデックスを返す。

“`
func SearchStrings(a []string, x string) int
SearchStrings searches for x in a sorted sl

元記事を表示

GoでDotenv(.env)を読み込む

https://github.com/profclems/go-dotenv

上記のモジュールを利用する。Readme以上の内容はとくに含まれていないので、英語を読むのが苦でない方はそちらを参照することを推奨する。

## 導入
“`shell
go get -u github.com/profclems/go-dotenv
“`

以上のコマンドを打ちインストールしておく。

## 実装
例えば以下のように.envファイルを作成する。このとき、必ず改行コードを「LF」にすること。こうしないと`\r`が含まれてしまう。

“`
PERSONAL_ACCESS_TOKEN=XXXXX
HOGE=hogefugapiyo
“`

また、ソースは以下のようになる

“`golang
package main

import(
“log”
“fmt”

“github.com/profclems/go-dotenv”
)

func main() {
dotenv.SetConfigFile(“path/to/.env”) //mainパッケージと

元記事を表示

腾讯云之无服务器云函数运行golang程序

使用腾讯的 [无服务器云函数](https://cloud.tencent.com/product/scf)启动了一个服务,用golang代码生成以太坊的私钥跟地址。

https://service-exvd0ctl-1258120565.ap-beijing.apigateway.myqcloud.com/release/addr
>![genEthAddr.png](https://upload-images.jianshu.io/upload_images/47789-0e2a5e777d322cd6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

### 无服务器云函数是什么
腾讯云的无服务器云函数,跟 aws lambda类似,把一段代码放到云函数服务器上,设定好访问路径, 就可以对外访问了。之前若想发布1段20行代码执行的服务,你可能需要买个vps,现在用腾讯的云函数即可,灵活方便,省资源。

### 小程序

如果要做些工具类微信小程序,生成eth、btc地址,查看天气数据,雾霾指数,运行个云函数,小程序

元記事を表示

分布式消息队列——NSQ

NSQ是Go语言编写的,开源的分布式消息队列中间件,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。
NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,是一个成熟的已在大规模生成环境下应用的产品。

http://www.jfh.com/jfperiodical/article/1949 我们是如何使用NSQ处理7500亿消息的
http://www.chenjie.info/1891
https://blog.csdn.net/kk936321732/article/details/79099796
https://segmentfault.com/a/1190000009194607
https://www.jianshu.com/p/2b01403e3443

元記事を表示

golang 基本语法

#### 打包工具

https://blog.bluerain.io/p/Golang-Glide.html

#### import
“`
import (
“database/sql”
_ “github.com/lib/pq” // 只引入, 不运行 init 函数
)
“`

#### Printf
“`
%d 十进制
%x %o %b 十六进制 八进制 二进制
%f %g %e 浮点数
%t 布尔类型
%c 字符(unicode码点)
%s 字符串
%q 带引号的字符
%v 内置格式的任何类型
%T 任何值的类型( 代替 reflect.TypeOf(x) )
%% %本身(转义符)
“`
“`golang
fmt.Printf(“|%-6s|%-6s|\n”, “foo”, “b”)
s := fmt.Sprintf(“a %s”, “string”)
fmt.Println(s)
// Printf通过 os.Stdout输出格式

元記事を表示

16进制转换10进制

“`golang
package main

import (
“fmt”
“strconv”
)

func main() {
hex := “0xC40C5253”
val := hex[2:]

n, err := strconv.ParseUint(val, 16, 32)
if err != nil {
panic(err)
}

n2 := uint32(n)
fmt.Print(n2)
}
“`

#### float64 convert to string

“`golang
package main

import “fmt”
import “strconv”

func FloatToString(input_num float64) string {

// to convert a float number to a string
return strconv.FormatFloat(input_num, ‘f’, 6, 64)
}

func ma

元記事を表示

Golang における配列とスライスのコピー時の違い

# Golang における配列とスライスのコピー時の違い

今回、私が配列とスライスを使用した時、そもそも配列とスライスの違いを意識せず使っていたため挙動を理解できていなかった経験からメモとして残しておく。

### では、仮にこういう問題を考えてみましょう

例えば、複数人で使うツール開発をしているとき、それぞれのユーザがそれぞれのデータを保持するために配列もしくはスライスを使う必要性があるとします。
ここで、それぞれのデータを共有して使いたいと考え、配列もしくはスライスを別の配列もしくはスライスにコピーして使用したいと考えました。
コピーしたデータを書き換えた際に、コピー元である他人のデータが勝手に書き変わったりそうでなかったりと不規則に影響が出てしまいました。果たしてそれは何故でしょうか。

# 実験

先程のシチュエーションを再現して考察してみましょう。

要素にする構造体
今回の説明で使用する構造体は以下の通りに定義されています。 配列(array)とスライス(slice),TestData型です。配列とスライスで比較しやすいように構造体にします。

“`Go:struct

元記事を表示

Laravel eloquentのtoArrayのソースを読む(goのdatabase/sqlと比較してみる)

# Laravelのeloquentに悩まされる

業務でLaravelを触っています。
個人では最近はGoやNextjs(Typescript)、少し前まではDjangoをよく触っていました。
LaravelはDjangoと比べてもコードの自動生成が圧倒的に充実しており便利である反面、型がゆるゆる過ぎて変なところでつまづき時折腹が立ちます。あと、フレームワークとして大きすぎるかななんて思ったりもしてます。

Laravel歴3ヶ月弱の自分がeloquentを使ってDBからデータを引っ張ってきてtoArrayした際に予期せぬ型で返すことがありました。
**なんだコイツ**と思いつつ謎を放置したままいるのも嫌だったのでソースコードを見てみようと思いました。

ということでEloquentのtoArrayのソースコードを読み解いていこうと思います。

### toArrayの定義はこちらです
https://github.com/illuminate/database/blob/master/Eloquent/Model.php#L1345

“`php
/**
* C

元記事を表示

[GCP]CloudBuild + CloudKMS + GitHubでタグプッシュデプロイを実現する(ほぼハンズオン)

## やりたいこと
– `GoogleCloudBuild`を利用
– ソースコードは`GitHub`で管理
– `GitHub`のリポジトリにタグ`Push`→`GoogleAppEngine`にデプロイ
– `CloudBuild⇆GitHub`のSSH鍵は`GoogleKeyManagementService`を利用
![GAE+CB+KMS+GitHub.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309580/31fef7b7-4a39-b416-66f4-7746c8be2cdb.jpeg “ToBe-Architecture”)

## 前提
– GCP(Google Cloud Platform)のアカウントを所持している
– GCPにプロジェクトを作成できる
– GitHubのアカウントを所持している
– サンプルで利用する言語はGo言語
– 投稿者の環境はMacOS(intel, Catalina)

## サンプルのディレクトリ構成
“`terminal:cloudbuild-

元記事を表示

DynamoDB+Goでmapのデータを取得する

# はじめに

GoでDynamoDBのmapのデータを取りたいときのメモ。
単純な構成は結構ググったら出てくるが、複雑な構成はググっても出てこず、試行錯誤した。

## TL;DR

* DBの要素にmapが入っている場合 -> [パターン1](#パターン1)
* mapがネストしている場合 -> [パターン2](#パターン2)
* リストの中にmapがある場合 -> [パターン3](#パターン3)
* mapを表現する構造体を定義する。
* mapを表現した構造体は、struct tagにキー名をつける。
* 各構造体のフィールドはエクスポートする。

## DBの構成

こんな構成。mapがネストしていたり、リストの中にmapが入っていたり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423952/d910f3c9-5d8b-e7a8-b6cb-820c0ba1cd72.png)

aws cliでget-itemするとこんな感じ。

“`shell
22:14:30 d

元記事を表示

【Go言語初心者】EC2インスタンス作成〜Vscodeで「hello go」するまで

Go言語の勉強をするなら、
いっそのこと、インスタンス上で勉強をしたいと思いhello goを出すまでできたので、
備忘録として記録しております。

## 環境
・MacOS
・Visual Studio Code
・Amazon linux2
・Go

[1.インスタンスの作成](#1-はじめに)
[2.EC2にSSH接続する](#2-EC2にSSH接続する)
[3.golangインストール](#3-golangインストール)
[4.vscodeでリモート接続する](#4-vscodeでリモート接続する)
[5.参考](#5-参考)

##1. EC2インスタンスの作成
AWSの画面は日々変わっていきますが、操作自体はそんなに変わらないと思います。
![スクリーンショット 2021-05-29 20.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700627/1ca4c898-8e53-4e74-c301-8a584b7c27c6.png)

まず、オレンジボタンの**「インスタンス

元記事を表示

リアルタイムOSコントローラ e-RT3 (Goから制御編)

#1.はじめに

横河電機の「[リアルタイムOSコントローラ(e-RT3)](https://www.yokogawa.co.jp/solutions/products-platforms/control-system/real-time-os-controller/)」における入出力モジュールの制御を、Go言語から制御する方法をまとめてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/2f2932c0-83b7-f87f-73c9-e1a9696e09c9.png)

目標としては、[前回記事](https://qiita.com/myasu/items/97ac50e968430487d5b5)のように、Rustから出力リレーの操作、入力の検知ができることとしています。

**リアルタイムOSコントローラ e-RT3 関連記事**

|||
|:–|:–|
|[第1回](https://qiita.com/myasu/items/057ce9ec2fa391

元記事を表示

GO 小数第N切り捨て

小数切り捨てをmath.Floorで対応した内容を書いていたのですが
コメントをいただいて、math.Floorでは誤差が起きることを知りました。
それから調べたところ以下のパッケージで対応しているようです。
・math/big.Rat
・github.com/shopspring/decimal

今回はshopspring/decimalの方で試してみました。

## 小数第3切り捨て
“`go
hoge := decimal.NewFromFloat32(87.689)

hogemi := hoge.Truncate(2)
fmt.Println(hogemi)
“`

## 小数第2切り捨て
“`go
hoge := decimal.NewFromFloat32(87.689)

hogemi := hoge.Truncate(1)
fmt.Println(hogemi)
“`

https://play.golang.org/p/jf4TJVbm7MV

## 以下にある、math.Floorの対応では誤差が出ます。
@Nabetani さんからいただいたコ

元記事を表示

Goの演習「Exercise: Loops and Functions」をやってみた

## 課題との出会い
GOのチュートリアルを進めていたら突如として課題が出てきました。
それがこちら
![スクリーンショット 2021-05-27 23.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/0699c634-d173-a293-2f79-1ea8cb81cf7e.png)

URL:https://go-tour-jp.appspot.com/flowcontrol/8

どうやら引数にある数値の平方根に近づけてみよ!とのこと
ニュートン法に関してはよくわからないのでスルーします。

## 実際にやってみた
“`
package main

import (
“fmt”
“math”
)

// 引数の平方根に近づける
func Sqrt(x float64) float64 {
z := 1.0

// 10回繰り返すことが要件となっている
for i:=1; i<=10; i++ { // 記載通りの計算式 z -= (z*z - x) /

元記事を表示

Golang + Docker + RDB ユニットテスト実行時のローカルのホスト名の問題

# Golang + Docker + RDB ユニットテスト実行時のローカルのホスト名の問題

最近 Golang が楽しくなってきた、今回は、Golang + Docker + RDB で Golangのユニットテストで RDB 等にレコードを挿入したいときに、実行時のローカルのホスト名を読みかえなければならない問題に関して、自動化を図る方法があったので、そのメモ。

# 何がしたいのか
Golang の test コードから config.ReadConfig() を呼び出すことで設定の読みかえが可能になります。
Docker 等を活用している際にローカルと仮想環境内で接続先を切り替えたいときに使用します。

# 各種ステップ

書き換えたいファイル

“`yaml:config.yml
db:
host: host.docker.internal #ここをlocalhostに書き換えたい
name: title
password: password
user: user
“`

今までは手動でいちいち切り替えていたが、あまりにも効率が悪すぎるので、test

元記事を表示

Cloud Run Admin APIでサービスを取得する時の注意点

特定のCloud Runサービスの情報を取得しようとした時に思いっきり嵌ったので備忘録を残しておきます。

まず始めにCloud Runを操作するAPIは以下に用意されています。

https://github.com/googleapis/google-api-go-client

上記ライブラリを読むと以下メソッドでCloud Runのサービス情報を取得できることが分かります。

“`go
// Get: Get information about a service.
//
// – name: The name of the service to retrieve. For Cloud Run (fully
// managed), replace {namespace_id} with the project ID or number.
func (r *NamespacesServicesService) Get(name string) *NamespacesServicesGetCall {
c := &NamespacesServicesGetCall{s:

元記事を表示

OTHERカテゴリの最新記事