package models
import (
"time"
"go.mongodb.org/mongo-driver/bson/primitive"
)
// Userはユーザーを表す構造体です。
type User struct {
ID primitive.ObjectID json:"_id" bson:"_id"
// ユーザーのID
First_Name *string json:"first_name" validate:"required,min=2,max=30"
// ユーザーの名字
Last_Name *string json:"last_name" validate:"required,min=2,max=30"
// ユーザーの名前
Password *string json:"password" validate:"required,min=6"
// ユーザーのパスワード
Email *string json:"email" validate:"email,required"
// ユーザーのメールアドレス
Phone *string json:"phone" validate:"required"
// ユーザーの電話番号
Token *string json:"token"
// ユーザーのトークン
Refresh_Token *string json:"refresh_token"
// ユーザーのリフレッシュトークン
Created_At time.Time json:"created_at"
// ユーザーの作成日時
Updated_At time.Time json:"updated_at"
// ユーザーの更新日時
User_ID string json:"user_id"
// ユーザーのID(文字列形式)
UserCart []ProductUser json:"usercart" bson:"usercart"
// ユーザーのカート内商品リスト
Address_Details []Address json:"address" bson:"address"
// ユーザーの住所情報リスト
Order_Status []Order json:"orders" bson:"orders"
// ユーザーの注文履歴リスト
}
// Productは商品を表す構造体です。
type Product struct {
Product_ID primitive.ObjectID bson:"_id"
// 商品のID
Product_Name *string json:"product_name"
// 商品の名前
Price *uint64 json:"price"
// 商品の価格
Rating *uint8 json:"rating"
// 商品の評価
Image *string json:"image"
// 商品の画像
}
// ProductUserはユーザーのカート内の商品を表す構造体です。
type ProductUser struct {
Product_ID primitive.ObjectID bson:"_id"
// 商品のID
Product_Name *string json:"product_name"
// 商品の名前
Price int json:"price" bson:"price"
// 商品の価格
Rating *uint json:"rating" bson:"rating"
// 商品の評価
Image *string json:"image" bson:"image"
// 商品の画像
}
// Addressは住所情報を表す構造体です。
type Address struct {
Address_id primitive.ObjectID bson:"_id"
// 住所のID
House *string json:"house_name"
// 住所の建物名
Street *string json:"street_name"
// 住所の通り名
City *string json:"city_name"
// 住所の都市名
Pincode *string json:"pin_code"
// 住所の郵便番号
}
// Orderは注文情報を表す構造体です。
type Order struct {
Order_ID primitive.ObjectID bson:"_id"
// 注文のID
Order_Cart []ProductUser json:"order_list" bson:"order_list"
// 注文のカート内商品リスト
Orderered_At time.Time json:"ordered_on" bson:"ordered_on"
// 注文の日時
Price int json:"total_price" bson:"total_price"
// 注文の合計金額
Discount *int json:"discount" bson:"discount"
// 注文の割引金額
Payment_Method Payment json:"payment_method" bson:"payment_method"
// 注文の支払い方法
}
// Paymentは支払い方法を表す構造体です。
type Payment struct {
Digital bool json:"digital" bson:"digital"
// デジタル支払い可否
COD bool json:"cod" bson:"cod"
// 代金引換可否
}
上記のコードは、ユーザー、商品、ユーザーカート、住所、注文、支払い方法に関するデータモデルを定義しています。これらのモデルは、データベースのコレクションに対応するドキュメントとして使用されることを想定しています。各フィールドはそれぞれの情報を表しており、必要に応じてバリデーションタグが追加されています。
例えば、User構造体はユーザーの個人情報やカート、住所、注文などの情報を含んでいます。Product構造体は商品の情報を表し、ProductUser構造体はユーザーのカート内の商品の情報を表します。Address構造体は住所の情報を表し、Order構造体は注文の情報を表します。また、Payment構造体は支払い方法の情報を表しています。
各構造体にはJSONタグとBSONタグが付いており、これらはデータのシリアライズやデシリアライズ時に使用されます。
structは、Go言語におけるデータの構造を定義するためのキーワードです。structは異なるデータ型を持つ複数のフィールドをグループ化し、ひとつのカスタムデータ型を作成するために使用されます。
以下は、structを使用してユーザーの情報を表すデータ構造を定義する例です:
type User struct {
ID int
FirstName string
LastName string
Email string
Phone string
}
上記の例では、Userという名前のstructが定義されています。Userには、ID、FirstName、LastName、Email、Phoneという5つのフィールドがあります。それぞれのフィールドには、対応するデータ型が指定されています(IDはint型、FirstNameなどはstring型)。
structを使用することで、関連するデータをひとつのまとまりとして扱うことができます。例えば、上記のUser構造体を使用して、複数のユーザー情報を格納するためのスライスを作成することができます:
users := []User{
{ID: 1, FirstName: "John", LastName: "Doe", Email: "john@example.com", Phone: "1234567890"},
{ID: 2, FirstName: "Jane", LastName: "Smith", Email: "jane@example.com", Phone: "9876543210"},
// ...
}
上記の例では、User型のスライスであるusersを作成し、複数のユーザー情報を要素として格納しています。各要素はUser構造体のインスタンスであり、{}内でフィールドの値を指定して初期化されています。
structを使用することで、関連するデータを簡潔かつ効果的に扱うことができます。さまざまなフィールドを持つデータ型を定義する際に活用される重要な機能です。
コードの中に登場する*は、ポインタ型を示すためにGo言語で使用されます。"User" structの定義においてFirst_Name *stringという記述は、"First_Name"フィールドが文字列へのポインタであることを示しています。
ポインタは、別の変数のメモリアドレスを格納する変数です。ポインタを使用することで、そのポインタが指す変数の値に間接的にアクセスし、変更することができます。この場合、"First_Name"が文字列へのポインタであることは、有効な文字列の値を指すことも、値が存在しないことを示すnilであることもあります。
文字列へのポインタを使用することで、元の文字列を変更せずに"First_Name"に新しい値を割り当てることができます。これは、関数に文字列を渡し、関数内でその値を変更する場合などに便利です。
以下に、"User" structを使用する例を示します。
package main
import (
"fmt"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type User struct {
ID primitive.ObjectID
First_Name *string
}
func main() {
user := User{
ID: primitive.NewObjectID(),
First_Name: nil,
}
firstName := "John"
user.First_Name = &firstName
fmt.Println(*user.First_Name) // 出力: John
}
上記の例では、"User" structを作成し、"ID"フィールドに新しいprimitive.ObjectIDを割り当てます。"First_Name"フィールドは最初にnilに設定されます。次に、新しい文字列変数"firstName"を作成し、&演算子を使ってそのアドレスを"user.First_Name"に割り当てます。最後に、*演算子を使って"user.First_Name"が指す値を表示します。
uint は、符号なし整数(unsigned integer)を表すデータ型です。Go言語では、符号を持たない整数の値を扱う場合に uint を使用します。
uint はビット幅(ビット数)に応じて異なるサイズがあります。例えば、uint8 は8ビット(1バイト)の符号なし整数を表し、値の範囲は0から255までです。同様に、uint16 は16ビット(2バイト)の符号なし整数であり、値の範囲は0から65535までです。さらに、uint32、uint64 など、さまざまなビット幅の uint 型が存在します。
符号なし整数は、非負の整数値を扱う場合に使用されます。例えば、配列のインデックス、ループカウンタ、ビット演算、データのビットフラグなどの目的で uint 型が利用されます。
以下は、Go言語で uint 型の変数を宣言し、使用する例です。
package main
import "fmt"
func main() {
var num uint8 = 10
fmt.Println(num) // 10
var index uint16 = 0
for index < 5 {
fmt.Println(index)
index++
}
}
この例では、uint8 型の変数 num を宣言して初期値を10とし、その後出力しています。また、uint16 型の変数 index を宣言し、0から4までの値を出力しています。
「符号を持たない」という言葉は、数値データ型が負の値を表現しないことを指します。符号なし整数(unsigned integer)は、0以上の非負の整数値を表現するためのデータ型です。
通常の整数データ型(符号付き整数)では、正の値と負の値の両方を表現することができます。例えば、符号付き8ビット整数の場合、-128から127までの範囲の値を表現できます。
一方、符号なし整数(unsigned integer)は、負の値を表現することはありません。符号なし整数のビットパターンは、正の整数の範囲内でのみ解釈されます。例えば、符号なし8ビット整数の場合、0から255までの非負の値を表現できます。
符号なし整数は、非負の整数のみを扱う場合に便利です。ビット演算やバイナリデータの処理、非負のカウンタやインデックスの使用など、特定のユースケースで一般的に使用されます。
ただし、符号なし整数を使用する際には注意が必要です。例えば、符号なし整数の差算において、結果が負の場合は正しく計算できないため、意図しない結果になることがあります。また、符号付き整数との混在や比較なども、意図しない結果をもたらす可能性があるため、注意が必要です。