以下のコードでなぜポインタ型にする必要があるのか知りたいです。
現状
現在Goの勉強を始めてから数日です。参考のコードに沿って勉強を進めていますが、ポインタ型の部分で理解できずにストップしている状態です。
自分のポインタ型の理解
Goでは、値型、参照渡し型があり、構造体は値型に当てはまる。値渡しでは、定義した変数が参照される際は、コピーを渡す。具体的にはある関数の引数に値型を渡し、関数内でその引数を書き変えたとしても、引数として渡した元の値は影響しないということは理解しています。
実現したいこと
以下一つ目のコードでの、Db.QueryRow(cmd, id).Scan()内でuserをポイント型にする必要があるのかを教えていただきたいです。
自分の理解では、以下二つのコードは共に構造体のフィールドに値を代入する、同じ動きだと理解しています。
しかし、上のコードではポインタ型にし、下のコードではポインタ型にせずとも代入できている部分で混乱しています。
どこの部分の理解が欠けているのでしょうか?
ご教示お願いいたします。
func GetUser(id int) (user User, err error) { user = User{} cmd := `select id, uuid, name, email, password, created_at from users where id = ?` err = Db.QueryRow(cmd, id).Scan( &user.ID, &user.UUID, &user.Name, &user.Email, &user.PassWord, &user.CreatedAt, ) return user, err }
type User struct { Name string Age int } func main() { a := User{} a.Name = "AA" a.Age = 22 fmt.Println(a) }
Scan の API ドキュメントによると、
https://pkg.go.dev/database/sql#Rows.Scan
> Scan simply assigns the value through the pointer.
と書かれています。
回答1件
あなたの回答
tips
プレビュー