エンジニア採用担当がプログラミング頑張る話【21日目/2ヶ月間】
こんにちは、@hiroki_maekawaです。
実は2〜3年ほど前からTech系YouTuberのTechLeadとJoma Techの動画を見ているんですが、今回その中で面白いコメントを見つけたのでシェアします。
特にJoma Techはギャグ線高めなので、気になる人は是非リンクから見てみて下さい。
それでは昨日に引き続き、自分が書いたコードでは「データベース全ての値を反映させることができないのはなぜなのか?」を理解するため、課題である「下記の簡単なコードを実行した結果、出てくる出力がなぜ"!!"だけなのかを考える」ことから始めました。
package main
import (
"fmt"
)
type A struct {
Name string
}
func main() {
a := &A{Name: "hello"}
txt := []string{"world", "!!"}
for _, t := range txt {
a.Name = t
}
fmt.Println(a.Name)
}
チュートリアルで変数やポインタ、配列、構造体などの復習、また@Sueken51さんにも質問をしながら分からないところがどこなのか探っていったところ、変数に代入される値の仕組みが分かっていなかったことに気づきました。
もし下記コードの最終出力が"!!"である場合、ある変数に対して最終的に宣言される値が最終出力されるので、
package main
import (
"fmt"
)
func main() {
a := "hello"
a = "world"
a = "!!"
fmt.Println(a)
}
この下記のコードも最終出力されるのは1であると説明ができます。
package main
import (
"fmt"
)
func main() {
for i := 0; i < 2; i++ {
fmt.Println(i)
}
}
そのため、一番上のコードも"!!"だけが最終出力されると理解することができました。(@Sueken51さん、1番上のコードに対する質問だけではなく、2つ3つ目のコードの例も出して分からないところを気づかせてくれるよう誘導頂き本当に感謝です。。)
そのため、自分が一昨日書いたコードの方も「なぜループ処理でデータベースにある3行全てのデータを表示させたいのに、1行しか出力されないのか?」という理由が分かりました。
package main
import (
"database/sql"
"fmt"
"net/http"
_ "github.com/go-sql-driver/mysql"
"github.com/labstack/echo"
)
//ID 宣言
var ID int
//Name 宣言
var Name string
//Price 宣言
var Price int
var err error
var db *sql.DB
//Fruits 構造体
type Fruits struct {
ID int `json:"id"`
Name string `json:"name"`
Price int `json:"price"`
}
func main() {
//Echo立ち上げる
e := echo.New()
//GETリクエスト(ルーティング)
e.GET("/show", show)
//サーバー起動
e.Start(":9000")
}
func show(c echo.Context) error {
fruits := Fruits{}
//接続
db, err = sql.Open("mysql", "root:11194222@/gomysql")
if err != nil {
fmt.Println(err)
}
defer db.Close()
//複数レコードをselect -> ループ処理
rows, err := db.Query("select id, name, price from gomysql")
if err != nil {
fmt.Println(err)
}
//ループ処理 + Next関数
for i := 0; i < 3; i++ {
rows.Next()
err = rows.Scan(&fruits.ID, &fruits.Name, &fruits.Price)
if err != nil {
fmt.Println(err)
} else if i == 3 {
break
}
}
return c.JSON(http.StatusOK, fruits)
}
ようやく原因が分かったところで、毎週のミーティングがありました。成果発表を行った後、今週の新しい課題の発表がありました。
・paizaのチュートリアル問題CとD(毎日1時間できるとこまで)
・API経由でCREATE/UPDATE/DELETEを行う
・記事100件APIの作成
・記事詳細APIの作成
・記事作成APIの作成
・記事更新APIの作成
・記事削除APIの作成
まだまだコードを自分で考えて書けるレベルではないので、paizaのチュートリアル問題を1日時間を決めて解くと良いのでは?というアドバイスを頂きました。
また、「自分の理解や方針が正しいのか?」をちょくちょく報告するすることで時間も節約することができるということなので、今週も積極的に現状の共有や質問をしていきたいと思います。(コーディングの前に自分が考えている設計を共有するなど)
また、RestfulAPIの理解について下記。
【用語】APIは、アプリケーションインターフェイス。Restful APIは、APIをどういう風に作るかの設計術。サーバーは、リクエストを受けて何か処理するもの。
【例】人間が電気をつけることを例にすると、人間がクライアント、電気がアプリケーション、電気のスイッチがインターフェイス、スイッチの種類が色々あるのは設計の方法が違うから。そのうちの設計の1つがRestful API。
今日できるようになったこと
・最終出力の値の判断
さいごに
今週末は、実現できない原因を考えながら、その過程で出てくる自分に足りない知識を補っていく作業がほとんどでした。
次から次へと分からないことが出てくる&見えない道を進んでる感じで、フラストレーション溜まりまくりですが、めげずに頑張っていきたいと思います。
それではまた!