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

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

利用Golang Colly, Goquery的yahoo股票台灣股市爬蟲

– [0. Intro](#0-intro)
– [1. Sample Code](#1-sample-code)
– [2. 聊聊細節](#2-%e8%81%8a%e8%81%8a%e7%b4%b0%e7%af%80)
– [2.1 Colly Basic & Queue](#21-colly-basic–queue)
– [2.2 SSL Ignore](#22-ssl-ignore)
– [2.3 Cookie](#23-cookie)
– [2.4 Domain Limit & filter](#24-domain-limit–filter)

## 0. Intro

雖然golang已經內建http讓engineer可以快速的搭配[Goquery](https://github.com/PuerkitoBio/goquery)來應付爬取回來的網頁,不過我還是喜歡[Colly](https://github.com/gocolly/colly)的優雅XD

下面的範例我們將會有綜合範例來講解透過Colly的queue機制來將想爬的網頁優雅的爬回來,再透過Coll

元記事を表示

有趣的golang switch statement

– [0. switch statement basic](#0-switch-statement-basic)
– [1. multiple case expressions](#1-multiple-case-expressions)
– [2. non-constants case expressions](#2-non-constants-case-expressions)
– [3. fallthrough](#3-fallthrough)
– [4. type switch](#4-type-switch)

[本文同步Post在www.p0n2.net中](https://www.p0n2.net/2020/04/golang-switch-statement.html)

## 0. switch statement basic

先來個最常見的switch statement,可以用不同的case來判於所宣告的變數做判斷。
並且在預設情況下每個case最後會有break,執行完成後會直接跳出switch不會繼續向下執行。

“` go
switch fruit

元記事を表示

GoでHello World!表示させてみた

技術文章を書く練習&上長に書きますといった手前引けなくなったので投稿

主にこのドキュメントをもとに調査
https://github.com/astaxie/build-web-application-with-golang/blob/master/en/preface.md

# Goの特徴
– 静的言語
– 並行処理
– 高速なコンパイル
– etc…

このような特徴があるようだ。まずは手を動かすことが大事なので、詳細は次回以降に調べる。

# Dockerで手軽にgo環境を用意してみる

“`:Dockerfile
#ベースとなるgoのバージョン指定
FROM golang:1.14.3-alpine

#作業用フォルダの作成
RUN mkdir /go/src/practice

#作業用フォルダの設定
WORKDIR /go/src/practice

#カレントディレクトリの全ファイルをコンテナにコピー
COPY . /go/src/practice
“`

Goで開発するには`$GOPATH` を最初に指定しなければならない。`$GOPATH`というのは、

元記事を表示

goでターミナルから簡単に目的のウェブページに飛ぶツール作った

### 成果物

[![Image from Gyazo](https://i.gyazo.com/4fe94e15c423e6ffa6ec50f9ffa36b2b.gif)](https://gyazo.com/4fe94e15c423e6ffa6ec50f9ffa36b2b)

gifのようにするには以下のコマンド(alias貼らないと実用的じゃない)

“`shell
$ bookmark-go show | fzf | bookmark-go open
“`

### 課題感
– アクセスしたいウェブページへのアクセス方法がバラバラ(slackの履歴からやscrapboxのwikiページからなど)でブラウザで表示するまでに時間がかかる
– chromeの履歴

元記事を表示

GOPATHの指定

##GOPATHの確認

“`
$ go env GOPATH
/Users/project/to/path/go
“`

##環境情報を一覧表示

“`
$ printenv
TERM_SESSION_ID=w0t0p0:F236B887-2A99-432B-89EA-01570DC27639
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.q3WJE4aYYO/Listeners
LC_TERMINAL_VERSION=3.3.12
COLORFGBG=7;0
ITERM_PROFILE=Default
XPC_FLAGS=0x0
LANG=ja_JP.UTF-8
etc
“`

##GOPATHの指定

“`
ホームディレクトリに移動
$ cd ~
ファイルの詳細情報の表示
$ ls -la
-rw——- 1 user staff 7131 7 2 18:43 .bash_profile
-rw-r–r– 1 user staff 206 8 24 21:07 .bashrc

元記事を表示

[Go]文字列をhashにして数字として取得したい

何かしらの文字列からhashを作成する事はそんなに難しくないと思いますが
hashを数字として取得したい事があると思います。
そんな時には [hash/fnv#Sum32()](https://golang.org/pkg/hash/fnv/)が使用出来ます。

以下は「文字列を入力して特定の色typeを返す」サンプルです。

“`Go
package main

import (
“fmt”
“hash/fnv”
)

type COLOR uint32

const (
COLOR_RED COLOR = 0
COLOR_BLUE COLOR = 1
COLOR_GREEN COLOR = 2
COLOR_PURPLE COLOR = 3
COLOR_BROWN COLOR = 4
)

func (c COLOR) String() string {
switch c {
case COLOR_RED:
return “RED”
case COLOR_BLUE:
return “BLUE”
case COLOR_GREEN:
re

元記事を表示

[Go言語] Sliceを完璧に複製するには? (How to perfectly clone a slice?)

# 結論

“`go
b := append(a[:0:0], a…)
“`

# 解説

`a[:0:0]` は `a[0:0:0]` の省略で、 **Full slice expressions**(フルスライス式?)と言います。

* その構文

“`go
a[low : high : max]
“`

> 最初のインデックス(`low`) が `0`の場合、`a[: high : max]` に省略することができます。

注意:普通のスライス式 `a[0:0]` ですと、 `b` が `a` と同じメモリを使うことになります。

# おまけ

“`go
b := make([]T, len(a))
copy(b, a)
“`

OR

“`go
b := append([]T(nil), a…)
“`

でも複製できますが、

前者は、`nil slice` を `non-nil blank slice` に、

後者は、`non-nil blank slice` を `nil slice` に複製してしまう問題あります。

`ni

元記事を表示

Golang – Convert uint64 to a String

“`golang
// Ref: https://golangcode.com/uint64-to-string/

package main

import (
“fmt”
“strconv”
)

func main() {

// Create our number
var myNumber uint64
myNumber = 18446744073709551615

// Format to a string by passing the number and it’s base.
str := strconv.FormatUint(myNumber, 10)

// Print as string
// Will output: ‘The number is: 18446744073709551615’
fmt.Println(“The number is: ” + str)
}
“`

https://golangcode.com/uint64-to-string/

元記事を表示

GoでFireBase Dynamic Linksの作成

# GoでFireBaseDynamicLinksの作成

今回はFirebaseDynamicLinksを初めて触ったため、備忘録として記事を投稿します。
基本的には[公式サイト](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)を確認すれば実装できそう。

## FirebaseDynamicLinksとは
FirebaseDynamicLinksとは、Twitter等のシェアメッセージをタップした際に、
アプリをインストールしているユーザは直接アプリを開き、
アプリをインストールしていないユーザはWeb等を開くためのリンクを生成する機能。
詳細は[公式サイト](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)をご確認してください。

## 今回使用したパラメータ
今回は以下のパラメータを使用

|パラメータ|詳細|
|—|—|
|domainURIPrefix|Firebaseコン

元記事を表示

色々な言語でファイルIOを競って速度比較

複数のプログラミング言語で約 1GB の CSV ファイルを Read/Write して時間を測定してみました!

# 共通ルール

– どの言語でも同じファイルを使用して確認すること
– ファイルは一行ずつ読み散り、一行ずつ書き込むこと
– OSの差を無くすため、Docker Image は全て base(Ubuntu 18.04 LTS)を使用すること

# まずは結果

|言語|5回実行した平均タイム(秒)|
|:–|:–|
|C-lang|6.2962|
|C++|6.0538|
|C#|17.1798|
|Golang|10.3966|
|Java|21.0840|
|Python|32.6949|
|Ruby|30.7153|
|Scala|21.8364|

やっぱりC/C++がダントツで早い!!
次点でGo言語

# 実装サンプル

5年ぶりくらいにC++書いたので綺麗ではないと思いますが、一番早かったのでサンプルとして載せます。

他の言語でも以下の動作をベースとして実装しました。

– 5回実行した平均時間を計算
– 1行読んで1行書き込む

“`c
#inc

元記事を表示

[Go] 並列処理と非同期処理

Goで並列処理。非同期処理を組み合わせた場合どう書く

使うもの

sync package (https://golang.org/pkg/sync/)
※ 非同期処理

go routine
※ 並列処理

コード

“`lang:go
package main

import (
“fmt”
“sync”
“time”
)

const (
MAX_EXECUTION_COUNT = 10 // 実行回数
CONCURRENT_COUNT = 5   // 同時実行数
)

func main() {
fmt.Printf(“Start : %s \n”, time.Now())
res := make(chan string, MAX_EXECUTION_COUNT)
concurrent := make(chan string, CONCURRENT_COUNT)
defer close(res)
defer close(c

元記事を表示

ポインタとは何か、初心者目線で解説してみた

業務でGO言語を扱うことになり、必死に勉強していたのですが、
ポインタが最初はなかなか理解できずに苦労しました。

今回はそんなポインタとはなんぞやという方に向けて解説していきたいと思います。

※自分もまだまだ未熟なため、一部不適切な部分があるかもしれませんが、ご了承ください。

ポインタを理解するために抑えておくべき用語

  ・メモリ
  ・アドレス
  ・値渡し

一応、さらっと用語について解説します。

#メモリとアドレス
メモリはデータを一時的に保存する場所ですね。
メモリに変数が格納され、変数に値が格納されています。
つまり、 メモリ<変数<値(文字列とか数値)という構造になります。

メモリは広大な野原だと思ってください。
その野原に変数という名の箱がたくさん置かれています。
多すぎて、どれが何の箱なのかわかりません。
なので、箱ごとに住所をつけて管理をします。

その住所がアドレスです。

“`main.go
a := “asfd”
fmt.Println(&a) // 0xc0

元記事を表示

Go 再入門 – VSCode で環境構築

## 概要

半年ほど前から Go 言語の勉強を始めたのだが、何かと忙しく放置気味になってしまった。余裕ができたので久しぶりに VSCode を開いたものの、PC 交換時に環境移行を怠ってしまい、再び環境構築から Hello, world までやり直したのでその備忘録。今回は Mac での作業だが、Windows でもパスなどを随時読み替えれば OK。

## 前提条件

– macOS High Sierra 10.13.6
– bash 3.2.57(1)-release
– Homebrew 2.4.13
– VSCode 1.48.1

## インストール

Homebrew 経由でインストール。

“`bash
brew install go
“`

バージョンは記事の執筆時点で `1.15`。

“`bash
go version
go version go1.15 darwin/amd64
“`

一応 Windows でもパッケージマネージャの Scoop 経由でインストールが可能。

## PATH 関連

### GOPATH

ソースコードや実行ファイル、

元記事を表示

AWS API Gateway がリクエストヘッダーを小文字にしてしまう時の解決策 (golang)

ここ最近業務で API Gateway + Lambda を使った開発を行っており、API Gateway の振る舞いで注意しなければならない点を見つけたので、解決方法も添えて記事にしたいと思います。開発言語は Go言語です

## AWS API Gateway がリクエストヘッダーを小文字にしてしまう

– 今回使用するサンプルプログラムです

“`go
package main

import (
“errors”
“fmt”
“log”

“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
“github.com/aws/aws-lambda-go/lambdacontext”
)

type (
request = events.APIGatewayProxyRequest
response = events.APIGatewayProxyResponse
)

// handler handles AWS Lambda execution.
func h

元記事を表示

ノート投稿型サービスをGoで作った話

# 概要
こんにちは。今回は1年弱ほどかけて5人の学生で開発したサービスの、サーバーサイドについてお話させていただきます。

## サービスの内容
学生をターゲットにした、大学の講義ノートのシェアリングサービス[eeNotes](https://eenotes.work/)を開発しました。大学の講義のノートや、試験前に作るまとめノートを作成、シェアすることができます。ノートは大学や授業名、ノートの内容から検索することができます。気になったノートは「いいね」できる他、フレーズを保存して、自分のノートに簡単に引用することができます。

## チームメンバー
チームメンバーはこんな感じです。役割分担は一応得意な分野で分かれていましたが、役割を超えてタスクを共有することが多かったです。

### サーバー
– 私
– [@あさしん](https://note.com/assassin_eng) – [しくじりから学ぶWebサービス開発の方法](https://note.com/assassin_eng/n/n0591d12e9912)

### フロント
– [@tjmschk](https:

元記事を表示

MacへGoをインストール・A Tour of Goをローカルで起動するまでにつまづいた所

ちょこちょこつまづいたので、どう解決したか順を追って書いておきます。

### HomebrewでGoをインストール

“`bash

$ brew install go
“`
### インストールされた場所を確認する
“`bash

? /usr/local/Cellar/go/1.15: 9,769 files, 494.3MB
“`
Homebrewだと/usr/local/Cellar/直下に入っていきます

### versionを確認する
“`bash

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

### 適当なディリクトリにファイルを作成
“`bash

$ mkdir -p ~/go/src/practice
“`

### Hello woldしてみる
practiceディリクトリにhello.go を作成する
参考 [Golang公式:Test your installation](https://golang.org/doc/install#testing)

“`go:hello.go

元記事を表示

deno(typescript)でインタプリタを作る

# はじめに
[Go言語でつくるインタプリタ](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF-Thorsten-Ball/dp/4873118220)という本を最近読みました。

この本はmonkeyと名付けられた独自言語が動くインタプリタをgoで作る本なのですが、理解を深めるためそのインタプリタをdenoで再実装をしました。
https://github.com/pokotyan/deno-monkey

そして、これをwebで実行できるようなプレイグランドにしました。
https://monkey-playground.netlify.app/
※herokuにデプロイしているのでサーバーが落ちてた場合、レスポンスが返ってくるのが遅いです
![スクリーンショット 2020-08-23 13.59.34.png](https://qiita-image-stor

元記事を表示

【Golang】goroutineのチャネル(channel)で意図せず無限ループした話

# 要約

– goroutineのfor-selectパターンでは、ゼロ値を受信して予期せず無限ループすることがある
– 受信チャネルからの第2返り値でゼロ値チェックをしよう

“`golang
for {
select{
case v, ok := <-ch: if ok { // 正常系処理 } else { // 異常系処理 } } } ``` # 発生状況 無限ループが発生したコードがこちら。 ```golang package main import ( "bufio" "context" "fmt" "io" "os" "strings" "time" ) func main() { if err := start(); err != nil { fmt.Fprintf(os.Stderr, "Error: %s\n", err) os.Exit(1) } } func start() error { bc := context.Background() timeou

元記事を表示

静的型付け言語と動的型付け言語の違いって?

Goを学習するにあたって、「静的型付け言語」と「動的型付け言語」の違いが、
なんとなく分かるような(説明はできない)レベルだったので、簡潔にまとめてみた。

## 静的型付け言語とは?

変数や、引数や返り値などの値の**型が**コンパイル時など、
その**プログラムの実行よりも前にあらかじめ決められている**、という言語

(例) Java, Go, C#, Scalaなど

“`java:hoge.java
public int add(int a, int b) {
int c;
c = a + b;
return c;
}
“`
※ 整数型`int`を設定している

### メリットは?

プログラム実行の前にコンパイルを行うので、

・**実行時の処理が速く**、**事前に型の整合エラーをチェックできる**

実行して初めてわかる問題をかなり減らすことできるため、大規模開発等に向いている。

## 動的型付け言語とは?
変数や、引数や返り値などの値の**型**を、**プログラムの実行時に決める**、という言語

(例) Python、Ru

元記事を表示

30時間制の時間表現を扱うパッケージを作った

## どうして?

テレビやラジオのタイムスケジュールを見ると、25:00のような表現を目にすることがありますよね。
ラジオ番組を日常的に聴取していると、”木曜1:00″という表現よりは、”水曜25:00″という表現の方がしっくりくるのですが、これを感覚的に使えるパッケージが見当たらなかったので、作ることにしました。
そもそも、この表現方法の名前が分からなかったので、ここでは仮に30時間制としています。(28時間制とか30時間制とか、いくつかありそうです)

![30時間制の説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271949/445c26d4-2f0f-2234-34a3-256f23758961.png)

## やったこと

timeパッケージを拡張してtimeextパッケージを作りました。
0:00:00-05:59:59間の時刻を30時間制に置き換えます。

用意した機能は`Parse`と`Forma

元記事を表示

OTHERカテゴリの最新記事