20200619のGoに関する記事は6件です。

まっさらなSSDにmint20betaをインストール

まず、editorなににしようかな?
この時間って、かなり至福な時間。

emacsとか、むかしのSSDもあるので、そこから.emacsを引っ張ってくれば
すぐに設定は終わると思いきや。。

まず、ちょうひさしぶりのosインストールから、さらにはeditor
時代が変わりすぎていた。

aptでとか思ったら、いまはsnapd? , flatpak?
なんじゃそれ?
なにげジェネレーションギャップを感じた

また、mintだけsnapdは、拒否られているさまw
あとからしらべてやっとわかったのだが、自分もsnapdのような文化はいやかもw
mintが拒否るのもしかたないというか、良い方向かもw

aptでなく、今回はgimpとemacsは、flatpakでいれてみた。

また、ここでジェネレーションギャップが。。
/usr/local/binあたりにemacsがあるのかな?と思ったら、
ちがうじゃんw

しかたないから、デスクトップにemacsをピンとめして、
そのファイルを見て、どこから起動してるかしらべるところからw

また、ここで、びっくりw
/usr/bin/flatpak その引数に emacsやらgimpがw
まあ、かなりのジェネレーションギャップだなw

とりあえず、emacsはインストールできたっと。(このさい、spacemacsにもこころが行ったが、やめといた)
で、go-modeのライブラリーをgo get で、。。
え??

なんか、様子がおかしいw

またここでw
”LSP”というあたらしい用語がw
さいしょemacsのLISP??のこと?とよぎったが、ちがったw

どんだけ世界が変わってるのだ?w
language server?w emacsの起動時もしくは、go関連のファイルを開いたら
ネットにってw重くないか?w

それも、goplsをgetしてとかよくわからないんだがw
emacsでちゃんとgoソースを開いて、autocompleteしてくれるまで、まだまだ道のりがながそうだw

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go言語でHelloWorldを実行しようとしたらエラーになった

Hello world が出来なかった話

業務でGolangを使用する機会がありました。
本格的には触らなかったので、とりあえず自習しようとしました。

  • とりあえずhello.goを作ってhello worldを表示しようとします。
$ go run hello.go
exec: "C:\\Users\\xxxxx\\AppData\\Local\\Temp\\go-build929698758\\b001\\exe\\hello": file does not exist

ああ??なんだこれ?hello World で死ぬか?普通?ってなったわけです。

失敗した原因

とりあえず build だけやってみる

xxxxx@xxx MSYS /c/Users/xxxxx/Documents/test/go
$ go build hello.go

xxxxx@xxx MSYS /c/Users/xxxxx/Documents/test/go
$ ls
hello  hello.go
  • バイナリ?が windows のじゃない!!

windowsで実行するなら

$ ls
hello.exe  hello.go

ができるのが正解ですよね~

こうなる原因が環境変数のGOOSでした。

$ env | grep GOOS
GOOS=linux

こうなっていたわけですよ。このGOOS=linuxがいけなかった。
業務中にテキトーに設定したのがいけなかった。
GOOS=linuxって環境変数を設定しているとbuildして作られるバイナリファイルがLinux向けに作られるっぽい?
MSYS2またはgit-for-windows上でなら実行できるのでは?とか思ったのですがエラーでしたね。
てことで、

どうすれば良いのか

GOOSを変えます

$ export GOOS=windows
# cmdだったら以下
set GOOS=windows

をした後に build すると
hello.exe が生成されますよっと。
これで解決。
GOOS=windowsに設定するのが正しいのかは知らない。
もうこの環境変数消した方がいいのかな。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

go修行8日目 Panicとか

エラーハンドリング

package main

import (
    "fmt"
    "log"
    "os"
)

func main() {
    file, err := os.Open("./tt.go")
    if err != nil {
        log.Fatalln("Error")
    }
    defer file.Close()
    data := make([]byte, 100)
    // errは上書きでinicializeしている
    count, err := file.Read(data)
    if err != nil {
        log.Fatalln("Error")
    }
    fmt.Println(count, string(data))
}
2020/06/19 08:37:42 Error

パニック

  • 例外エラーの中の例外
  • 何をしたらいいかわからない状態なのでなるべくエラーハンドリングするとよい
package main

import "fmt"

// DB接続パッケージ
func thirdPirtyConnectDB() {
    panic("Unable to connect database")
}

func save() {
    // 強制終了させないようにrecoverする
    defer func() {
        s := recover()
        fmt.Println(s)
    }()
    thirdPirtyConnectDB()
}

func main() {
    save()
    fmt.Println("OK?")
}
Unable to connect database
OK?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vue.jsからaxiosでGoにパラメータ渡せなくてつまり続けたが、Echo導入したら即解決した

Vueで入力された値をJson形式でGoに渡して処理をさせたかった。
うまい感じに渡せず、詰まったがEcho導入したら即解決した。

やりたいこと

  • VueからPost(非同期)でパラメータを渡して、Goで処理をさせたい。
    • とりあえず、Axiosで送信したparamsがGoで受け取れていることを確認したい。

VueとAxios

あるボタン押下時にtestを実行して、data1とdata2をjson形式でpostする。
Goの処理結果をconsoleに表示する。

axiosはpost時、以下のように渡せば自動的にjson形式にしてくれるらしい。

vue.js(一部抜粋)
<script>

export default {
  name: 'SqlGenerater',
  data() {
    return {
      data1:'1',
      data2:'2',
    }
  },
  methods:{
    test(){
      let params= {
        data1: this.data1,
        data2: this.data2,
      }
      this.$axios.get('/api',{ params: params })
      .then(response => {
        console.log(response.data)
      })
    }
  }
}
</script>

Go(Echo)

Echo公式のrequestにかなりわかりやすく書いてある。
下記のようにすれば自動でバインドできるみたい。すごく便利ぃ

main.go
package main

import (
    "net/http"

    "github.com/labstack/echo"
)

type Test struct {
    Data1  string `json:"data1" form:"data1" query:"data1"`
    Data2  string `json:"data2" form:"data2" query:"data2"`
}

func main() {
    e := echo.New()
    e.GET("/", index)
    e.Logger.Fatal(e.Start(":8081"))
}

func index(c echo.Context) (err error) {
    t := new(Test)
    if err = c.Bind(t); err != nil {
        return
    }
    return c.JSON(http.StatusOK, t)
}

実行したら、ちゃんと取れてることが確認できた。

console
{data1: "1", data2: "2"}

ありがとうEcho

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Golang】テスト

【Golang】テスト

Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

//main.go
package main
//testing
//テストを書く位置は、テストしたいファイルと同じ階層に書く.
//math.go = math_test.go という名前で作成。_test.goを探して実行される
//math_test.goに移動

//ターミナルで プロジェクトの中で、go test ./... で実行できる
//詳しいテスト内容を表示 go test -v ./...
/*
?       kiso_blog/go_test   [no test files]
ok      kiso_blog/go_test/alib  0.328s
*/

//相対パスでテストをやる場合、go test ./alib 
/*
aoyagimasanori@aoyagimasanorinoMacBook-Pro go_test % go test ./alib 
ok      kiso_blog/go_test/alib  0.302s
*/

//カバー率 go test -cover ./alib 
/*
ok      kiso_blog/go_test/alib  0.246s  coverage: 100.0% of statements
*/

//mainパッケージのテスト
//go test -v
/*
=== RUN   TestIsOne
    TestIsOne: main_test.go:15: 2 != 1
--- FAIL: TestIsOne (0.00s)
FAIL
exit status 1
FAIL    kiso_blog/go_test   0.226s
*/


//ユニットテストをやる場合は、Ginkgo(rubyっぽい),Gomega(jsっぽい)などを使ったりする
import (
    "fmt"
    //ここのエラーは相対パスだから
    //"./alib"
    "kiso_blog/go_test/alib"
)

func IsOne(i int) bool {
    if i == 1{
        return true
    }else{
        return false
    }
}

func main() {
    s := []int{1,2,3,4,5}
    fmt.Println(s)
    fmt.Println(alib.Average(s))
}
//main_test.go
package main
//mainパッケージのテスト

import "testing"

var Debug bool = false

func TestIsOne(t *testing.T) {
    i := 2
    if Debug{
        t.Skip("スキップする")
    }
    v := IsOne(i)

    if !v{
        t.Errorf("%d != %d",i, 1)
    }
}
//alib/alib.go
package alib


func Average(s []int) int {
    total := 0
    for _, i := range s {
        total += i
    }
    return int(total / len(s))
}
//alib/alib_test.go
package alib

//テスト用パッケージを読み込み
import "testing"

//このテストを飛ばしたい時はtrueにする
var Debug bool = false

//テスト
//Average関数のテスト例
//Test関数名にする
//引数はtにする。Errorなどの関数が使える。Skipなど
func TestAverage(t *testing.T) {
    if Debug {
        t.Skip("スキップします")
    }
    //ave3.5(1,2,3,4,5,6)は3になるらしい。
    //7までにすると、下記エラーが出る
    /*
            === RUN   TestAverage
            TestAverage: alib_test.go:22: 3じゃない 4
            TestAverage: alib_test.go:23: 4 != 3
            --- FAIL: TestAverage (0.00s)
            FAIL
            FAIL    kiso_blog/go_test/alib  0.308s
            FAIL
    */
    v := Average([]int{1, 2, 3, 4, 5}) //6,7 でエラー
    //もし、3でなければエラー
    if v != 3 {
        //エラー文字、値
        t.Error("3じゃない", v)
        t.Errorf("%d != %d", v, 3)
    }
}

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Golang】データベース操作 sqlite3

【Golang】データベース操作 sqlite3

Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

package main

/*
sqliteをインストールする際の手順の確認

PostgreSQL は次回。ほぼ同じだが。

インストール済
https://qiita.com/__init__/items/2edfc7acf11234e5b1aa

Mac
# brew のインストール
-> https://brew.sh/index_ja

# sqlite3 をインストール
brew install sqlite

Install gcc C言語のライブラリをインポートするので、GOがビルドする際に必要
-> https://developer.apple.com/xcode

# ドライバのインストール
go get github.com/mattn/go-sqlite3

# 不要だが一応
export CGO_ENABLED=1

Windows
Install sqlite3
-> https://www.sqlite.org/download.html

Install gcc
-> http://tdm-gcc.tdragon.net/

# ドライバのインストール
go get github.com/mattn/go-sqlite3

# 不要だが一応
set CGO_ENABLED=1

macでバージョン確認
# sqlite3 インストール確認
$ sqlite3
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
# sqlite3 を抜ける
sqlite> .exit

# xcode のコマンドラインツールの確認
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates

# gcc インストール確認
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin


//データベース操作


*/

import (
    "database/sql"
    "fmt"
    "log"

    //インポート _にしないとコンパイルエラーになる。使用しない為
    _ "github.com/mattn/go-sqlite3"
)

var DbConnection *sql.DB

type Person struct {
    Name string
    Age  int
}

func main() {
    //1
    //DBを開く  なければ作成される
    DbConnection, _ := sql.Open("sqlite3", "./example.sql")
    //終わったら閉じる
    defer DbConnection.Close()
    //DB作成 SQLコマンド
    cmd := `CREATE TABLE IF NOT EXISTS person(
        name STRING,
        age  INT)`

    //実行 結果は返ってこない為、_にする
    _, err := DbConnection.Exec(cmd)

    //エラーハンドリング
    if err != nil {
        fmt.Println("エラー")
        log.Fatalln(err)
    }

    //ターミナル
    //sqlite3
    //.table
    //SELECT * FROM tablename;
    //で確認

    //2 CRUD処理
    //Create
    //データを追加
    //VALUES (?, ?)  値は後で渡す。セキュリテイの関係でこのようにする方がいい
    //SQLインジェクション 悪意あるコマンドでDBが操作されてしまうのを防ぐ ?でエスケープしてくれる
    cmd = "INSERT INTO person (name, age) VALUES (?, ?)"
    //実行
    //レコードを取得する必要のない、クエリはExecメソッドを使う
    //第二引数からは、コマンド?部の値
    _, err = DbConnection.Exec(cmd, "Nancy", 20)
    if err != nil {
        log.Fatalln(err)
    }

    //Update
    //データの更新 Mike が存在する場合
    cmd = "UPDATE person SET age = ? WHERE name = ?"
    _, err = DbConnection.Exec(cmd, 25, "Mike")
    if err != nil {
        log.Fatalln(err)
    }

    //Read
    //Get  All
    //マルチセレクト
    //データ全てをループで表示
    //Queryは全て取得する
    cmd = "SELECT * FROM person"
    rows, _ := DbConnection.Query(cmd)
    defer rows.Close()
    //structを作成
    var pp []Person
    //取得したデータをループでスライスに追加 for rows.Next()
    for rows.Next() {
        var p Person
        //scan データ追加
        err := rows.Scan(&p.Name, &p.Age)
        if err != nil {
            log.Println(err)
        }
        pp = append(pp, p)
    }
    err = rows.Err()
    if err != nil {
        log.Fatalln(err)
    }
    //表示
    for _, p := range pp {
        fmt.Println(p.Name, p.Age)
    }

    //特定のデータを取得
    cmd = "SELECT * FROM person where age = ?"
    //age = 20にして実行
    //QueryRowは最初の一件だけ取得する。
    row := DbConnection.QueryRow(cmd, 20)
    var p Person
    err = row.Scan(&p.Name, &p.Age)
    if err != nil {
        //データがなかったら
        if err == sql.ErrNoRows {
            log.Println("No row")
            //それ以外のエラー
        } else {
            log.Println(err)
        }
    }
    fmt.Println(p.Name, p.Age)

    //Delete
    //データの削除  全て
    cmd = "DELETE FROM person WHERE name = ?"
    _, err = DbConnection.Exec(cmd, "Nancy")
    if err != nil {
        log.Fatalln(err)
    }

    //マルチセレクト  テーブルもSQLインジェクション対策
    //こちらを推奨
    //データを構造体に入れて表示
    //テーブルはSQLインジェクション対策が使えない
    tableName := "person"
    //テーブル名指定は?が使えない為、%sを使う。
    //後に対応されるかも?
    cmd = fmt.Sprintf("SELECT * FROM %s", tableName)
    rows1, _ := DbConnection.Query(cmd)
    defer rows1.Close()
    var pp1 []Person
    //パターンとして覚える
    for rows1.Next() {
        var p Person
        //データを構造体に追加
        err := rows1.Scan(&p.Name, &p.Age)
        if err != nil {
            log.Println(err)
        }
        //ppに追加
        pp1 = append(pp1, p)
    }
    //まとめてエラーチェック
    err = rows1.Err()
    if err != nil {
        //エラーなら終了
        log.Fatalln(err)
    }
    for _, p := range pp1 {
        fmt.Println(p.Name, p.Age)
    }
}

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む