Open47

GoでAPI作成

キンジョウ/金城翔太郎キンジョウ/金城翔太郎

dockerの大まかな流れ

  • buildをする
  • buildしたかを確認する(buildできていたら、imagesが作られる)
  • buildして生成したimagesを元にコンテナを作成する

この流れでdockerの上で開発できるようになる

キンジョウ/金城翔太郎キンジョウ/金城翔太郎

cloud runcloud functionsの違いは、functionsは関数をdeployするだけでcloud runはコンテナをdeployするので、関数からDBまでDockerのコンテナをdeployしているのと同じイメージかも??

キンジョウ/金城翔太郎キンジョウ/金城翔太郎

go mod initはローカルで実行するだけなら、適当でもいい
ちゃんとGitHubで公開してやるなら、go mod init 'GitHubのURL'
例: github.com/kinjo1130/go-api
上記の感じでやっていけばいい

キンジョウ/金城翔太郎キンジョウ/金城翔太郎

https://qiita.com/wangqijiangjun/items/bac983a8d9f235d7cef0
ポインタはなんであるんかな?って思ってたけどこういう理由があるのか
でも、定数を使ったらいいんじゃない?
JSでいうならconstとか

「ポインタはなぜ必要なのか」という問いに答えるとするならば、「データを参照する際に、データが保持されているアドレスを渡して、意図せずにデータが変更されるのを防ぐため」と言うのが答えになります。

キンジョウ/金城翔太郎キンジョウ/金城翔太郎

GoにはTSでいうenumがないので、自作した

main.go
type  TaskStatis int
const (
   Done TaskStatus = iota
   Doing
)

type Todo struct {
  id int
  title string
  status TaskStatus
}

func showTaskStatus(){
   var todo Todo
   todo.status = Done
}
キンジョウ/金城翔太郎キンジョウ/金城翔太郎

init()これはmain()よりも先に実行されて、複数書くことができる
main()はパッケージに一つしか書けない
init()は複数書いても、区別されている

キンジョウ/金城翔太郎キンジョウ/金城翔太郎

最小インスタンスを設定しておくと、コールドスタートにならない代わりにその時間も課金が発生するよってことか

だから、最初のリクエストが遅くてもいいなら、最小インスタンスを割り当てないくてもいい

キンジョウ/金城翔太郎キンジョウ/金城翔太郎

type User struct {
Name string json:"name" xml:"name" form:"name" query:"name"
Email string json:"email" xml:"email" form:"email" query:"email"
}

e.POST("/users", func(c echo.Context) error {
u := new(User)
if err := c.Bind(u); err != nil {
return err
}
return c.JSON(http.StatusCreated, u)
// or
// return c.XML(http.StatusCreated, u)
})
構造体に対して上記のようにタグ付けをすることで、リクエストのContent-Typeとそのキーに基づいてデータを紐付けるが出来ます。(*context) Bindの使用方法はとても簡単で、タグ付けが行われている構造体のゼロ値のポインタを引数に取るだけです。 application/json や application/x-www-form-urlencoded で該当の値が送られてきた場合、よしなに構造体へのデータ格納を行ってくれます。

(*context) JSONが初めて出てきましたが機能としては(*context) Stringと大差はありません。構造体やマップ等を渡せばjsonへのエンコードを行い、ステータスコードとともにレスポンスへ書き込みます。

これも少し理解した

キンジョウ/金城翔太郎キンジョウ/金城翔太郎

Goの構造体において、フィールド名が小文字で始まっているとそれは非公開(プライベート)フィールドとなります。これは、そのフィールドが定義されているパッケージの外部からはアクセスできないことを意味します。そのため、非公開フィールドにjsonタグをつけても、外部からそのフィールドにアクセスできないため、このようなエラーメッセージが出ています。

これを解決するためには、フィールド名を大文字にして公開(パブリック)フィールドにする必要があります。その際、jsonタグを用いてJSON形式での名前を小文字にすることが一般的です。以下に示すように修正してみてください:

go
Copy code
type MyStruct struct {
Name string json:"name"
}
この例では、フィールドNameは公開されているため、パッケージ外からもアクセス可能です。また、JSONにエンコードされる際のキーは小文字のnameとなります。

キンジョウ/金城翔太郎キンジョウ/金城翔太郎

FindById(id int) (User, error)関数は、指定されたIDを持つユーザーを探し、そのユーザーを返すか、エラーを返すという意味です。ここで、戻り値としてUserを返している理由は二つあります。

ポインタを使うことでメモリ効率が良くなる: Userが大きな構造体だった場合、そのコピーを作ると(つまり、値を直接返すと)メモリを大量に消費します。しかし、ポインタを使うと、オリジナルのUser構造体への参照だけを返すため、メモリ効率が良くなります。

nilを返すことが可能になる: もし該当するUserが見つからなかった場合やエラーが発生した場合、ポインタではnilを返すことが可能です。これは値そのものを返すとできないことです。この機能を利用すると、該当するユーザーが存在しない場合や何らかのエラーが発生した場合に、特別なUser値(例えば、IDが-1のユーザー)を用意する必要がなくなります。FindById(id int) (User, error)関数は、指定されたIDを持つユーザーを探し、そのユーザーを返すか、エラーを返すという意味です。ここで、戻り値としてUserを返している理由は二つあります。

これはなるほどおおおおって感じ
めっちゃ理解できる