20200522のGoに関する記事は4件です。

ポインタ型変数自体にあるアドレスと、ポインタ型変数に代入されたポインタの示すアドレス

何言ってるんだってなると思うのでコードで。
ポインタ型変数自体のアドレスっていうのに一瞬混乱した。

    // ポインタを格納する変数
    var test *int
    var test2 *int

    // ポインタを格納する変数に対して、ポインタを代入
    a := 1
    test = &a
    test2 = &a

    fmt.Printf("%#v\n", "aのポインタ(アドレス)")
    fmt.Printf("%#v\n", &a)    // (*int)(0xc000010108)


    fmt.Println("")
    fmt.Println("")
    fmt.Println("変数test")
    fmt.Println("")
    // 「ポインタを格納する変数に代入された変数」のアドレス
    fmt.Printf("%#v\n", "「ポインタを格納する変数に代入された変数」のアドレス")
    fmt.Printf("%#v\n", test)    // (*int)(0xc000010108)

    // 「ポインタを格納する変数に代入された変数」のアドレスからたどった値
    fmt.Printf("%#v\n", "「ポインタを格納する変数に代入された変数」のアドレスからたどった値")
    fmt.Printf("%#v\n", *test)    // 1

    // 「ポインタを格納する変数自体」のアドレス
    fmt.Printf("%#v\n", "「ポインタを格納する変数自体」のアドレス")
    fmt.Printf("%#v\n", &test)    // (**int)(0xc000006030)

    // 「ポインタを格納する変数自体」のアドレスからたどった値(つまり、変数に代入された値)
    fmt.Printf("%#v\n", "「ポインタを格納する変数自体」のアドレスからたどった値")
    fmt.Printf("%#v\n", *&test)    // (*int)(0xc000010108)

    fmt.Println("")
    fmt.Println("")
    fmt.Println("変数test2")
    fmt.Println("")
    // 「ポインタを格納する変数に代入された変数」のアドレス
    fmt.Printf("%#v\n", "「ポインタを格納する変数に代入された変数」のアドレス")
    fmt.Printf("%#v\n", test2)    // (*int)(0xc000010108)

    // 「ポインタを格納する変数に代入された変数」のアドレスからたどった値
    fmt.Printf("%#v\n", "「ポインタを格納する変数に代入された変数」のアドレスからたどった値")
    fmt.Printf("%#v\n", *test2)    // 1

    // 「ポインタを格納する変数自体」のアドレス
    fmt.Printf("%#v\n", "「ポインタを格納する変数自体」のアドレス")
    fmt.Printf("%#v\n", &test2)   // (**int)(0xc000006038)

    // 「ポインタを格納する変数自体」のアドレスからたどった値(つまり、変数に代入された値)
    fmt.Printf("%#v\n", "「ポインタを格納する変数自体」のアドレスからたどった値")
    fmt.Printf("%#v\n", *&test2)   // (*int)(0xc000010108)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Golang】パニック、リカバー

【Golang】パニック、リカバー

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

package main
//パニック(例外)、リカバリー(復帰)
//パニックより推奨されているのは、エラーハンドリング
//強制的に終了する強力な機能な為、あえて使わない方がいい

import (
    "fmt"
)

//外部DB接続をイメージ
func thirdPartyConnectDB() {
    //パニックを起こす。例外を発生させる。
    panic("Unable to connect database!")
}

func save() {
    //deferを先に書く
    defer func() {
        //リカバリー システム終了をキャッチして復帰させる。
        s := recover()
        fmt.Println(s)
    }()
    thirdPartyConnectDB()
}

func main(){
    save()
    fmt.Println("リカバーしているので表示される")
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gormでcsvをdatabaseに入れる

仕事で今だにexcelファイルを何枚も用意して管理をしているデータがあったので
管理システム作ることにしました。
その際に現状のデータをcsvに変えてgoでデータベースへぶち込んだ際の備忘録兼個人メモです。
至らぬところばかりですが、ご了承ください。

gormを用いてmysqlに入れてます

go get -u github.com/jinzhu/gorm
sample.csv
佐藤,24,神奈川
向井,19,香川
田中,44,長野

tree

csv_to_db
├── db_connect
│   └── db_connect.go
├── sample.csv
└── main.go
db_connect.go
package database_connect

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

func GormConnect() *gorm.DB {
    DBMS := "mysql"
    USER := "root"
    PASS := "You Pass"
    PROTOCOL := "tcp(0.0.0.0:3306)"
    DBNAME := "DB name"

    CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME
    db, err := gorm.Open(DBMS, CONNECT)

    if err != nil {
        panic(err.Error())
    }
    return db
}
main.go
package main

import (
    "encoding/csv"
    "fmt"
    "github.com/jinzhu/gorm"
    "github.com/sudyusuk/csv_to_db/db_connect"
    "os"
    "strconv"
)

type Databases struct {
    UserDatabase *gorm.DB
}

//データベース側は複数系じゃないといけない ex:table_names
type TableName struct {
    Name      string    `gorm:"column:name"`
    Age       int       `gorm:"column:age"`
    Address   string    `gorm:"column:address"`
}

func main() {

    user_db := database_connect.GormConnect
    databases := Databases{user_db()}

    if err := databases.readJson("./sample.csv");err != nil {
        fmt.Println(err)
    }

}

func (d *Databases) readJson(path string) error {

    csvFile, err := os.Open(path)
    if err != nil {
        return err
    }
    defer csvFile.Close()

    reader := csv.NewReader(csvFile)
    reader.FieldsPerRecord = -1

    csvData, err := reader.ReadAll()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    for _, data := range csvData {
        age ,_ := strconv.Atoi(data[1])
       //intに変換

        oneLine := CreateOneLine(data[0],age,data[2])
        d.CreateDatabase(*oneLine)
    }
    return nil
}

//ここ作らなくてもいいけど、分かりやすく見やすいから。
//レコードを作る
func CreateOneLine(name string,age int ,address string) *TableName {
    return &TableName{name,age,address}
}

//保存
func (d *Databases) CreateDatabase(oneLine TableName) {
    d.UserDatabase.Create(&oneLine)
}

以上です。。
陳腐なコードですので気になるところばかりだと思いますが、その際はご教授いただけると嬉しいです。
goは楽しい

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

【Golang】カスタムエラー

【Golang】カスタムエラー

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

//カスタムエラー
//Stringer同様errorもある。
//interface3の使い方

/*Errorメソッドを持つ型をまとめている
type error interface {
    Error() string
}
*/

package main 

import (
    "fmt"
)

//4
//カスタムエラーの名前
type UserNotFound struct {
    Username string
}


//5
//特殊メソッド
//エラーの出力を変える
//ポインタ型で指定する。
func (e *UserNotFound) Error() string {
    //これが出力される
    return fmt.Sprintf("User not found: %v.\n", e.Username)
}

//2
//エラーを返す関数
//返り値をエラー型にする
func MyFunc() error {
    ok := false
    if !ok {
        //3
        //エラーを返す
        //エラーを定義する時は、&をつける
        //&はなくても実行はできるが、ルールとしてつける。
        //エラーハンドリングでバグの原因になる
        //アドレスで比較する
        return &UserNotFound{Username: "mike"}
    }
    return nil
}

func main() {
    //&UserNotFound{Username: "mike"}で&をつける理由
    e1 := &UserNotFound{"mike"}
    e2 := &UserNotFound{"mike"}
    fmt.Println(e1 == e2)
    //>>false
    //&がなければTrueになる
    //e1とe2は違うという事。異なるエラー。アドレスで比較しないと同じエラーになってしまう。


    //1
    //もしエラーが帰ってきたらエラーを出力
    //エラーじゃなかったらnilを返す
    err := MyFunc()
    if err != nil {
        fmt.Println(err)
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む