- 投稿日:2020-05-22T21:51:53+09:00
ポインタ型変数自体にあるアドレスと、ポインタ型変数に代入されたポインタの示すアドレス
何言ってるんだってなると思うのでコードで。
ポインタ型変数自体のアドレスっていうのに一瞬混乱した。// ポインタを格納する変数 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)
- 投稿日:2020-05-22T21:05:58+09:00
【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("リカバーしているので表示される") }
- 投稿日:2020-05-22T12:34:52+09:00
gormでcsvをdatabaseに入れる
仕事で今だにexcelファイルを何枚も用意して管理をしているデータがあったので
管理システム作ることにしました。
その際に現状のデータをcsvに変えてgoでデータベースへぶち込んだ際の備忘録兼個人メモです。
至らぬところばかりですが、ご了承ください。gormを用いてmysqlに入れてます
go get -u github.com/jinzhu/gormsample.csv佐藤,24,神奈川 向井,19,香川 田中,44,長野tree
csv_to_db ├── db_connect │ └── db_connect.go ├── sample.csv └── main.godb_connect.gopackage 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.gopackage 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は楽しい
- 投稿日:2020-05-22T00:11:41+09:00
【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) } }