Raspberry Pi4 で GO言語を書いてみた(1)

**はじめに**
初めての Go言語 を自分なりに理解した内容をメモ書きとして記載する。
動作は、Raspberry Pi4 上で Go言語 と 「ECHO」の環境であり その構築方法は、
[『Raspberry Pi4 に Go言語 と 「ECHO」の環境を構築する』](https://qiita.com/ytetsuo/items/60b654c0bac40d17c575)に記述している。

---
***基本機能のソースコード***
ここでは、下記の基本機能に絞ったソースコードを記載する。
1. 引数(flag)
2. 表示(fmt)
3. 他サーバーからデータを受信
4. Webサーバ（net/http) Hellow World! と表示

ソースコードの意味は、コメントを見て下さい。

【参考情報】
[https://github.com/labstack/echo](https://github.com/labstack/echo)
[https://echo.labstack.com/guide](https://echo.labstack.com/guide)

~~~main.go
//////////////////////////////////////////////////
// go言語 / Echo 環境下での基本動作
//
// 1. 引数(flag)
// 2. 表示(fmt)
// 3. 他サーバーからデータを受信
// 4. Webサーバ（net/http) Hellow World! と表示
//
// 参考：https://github.com/labstack/echo
//      https://echo.labstack.com/guide/
//////////////////////////////////////////////////
package main

import (
  "fmt"
  "flag"
  "net/http"
  "github.com/labstack/echo/v4"
  "github.com/labstack/echo/v4/middleware"
)

const (
  IP       = "192.0.0.1"
  API_PORT = 3000
  Users    = "/Users"
  Return   = true
)

//　構造体の定義 {"name":"Name", "email":"mail_address@xxxx.xx.jp" }
type User struct {
	 Name  string `json:"name" xml:"name" form:"name" query:"name"`
	 Email string `json:"email" xml:"email" form:"email" query:"email"`
}

func saveUser(c echo.Context) error {

    // 構造体を初期化後 データを受け取る
    u := new(User)
    if err := c.Bind(u); err != nil {
		  return err
	  }

    // 受け取ったデータを表示
    fmt.Println(u)

    if Return == true {
      // 受け取ったデータを JSON形式で返す
      return c.JSON(http.StatusCreated, u)
    } else {
      //レスポンスコード 204 No Content(エラーなし)を返す
      return c.NoContent(http.StatusOK)
    }
}

func main() {
  // 1. 引数(flag) -ip xxx.xx.xx 
  ip := flag.String("ip", IP, "IP Address")
  flag.Parse()
  ipaddress := *ip

  // 2. 表示(fmt)
  fmt.Println("IP:", ipaddress)

  // Echo instance
  e := echo.New()

  // Middleware
  e.Use(middleware.Logger())
  e.Use(middleware.Recover())

  // 3. 他サーバーからデータを受信
  e.POST(Users, saveUser)

  // 4. Webサーバ（net/http) Hellow World! と表示
  e.GET("/", hello)

  // Start server
  e.Logger.Fatal(e.Start(ipaddress + ":3000"))
}

// Handler
func hello(c echo.Context) error {
  return c.String(http.StatusOK, "Hello, World!")
}
~~~

ソースコードが置かれている場所で下記を実行

```
$ go mod init exsample.com/m
$ go mod tidy
```

その後 プログラムを下記の様に起動
※xxx.xxx.xxx.xx は、raspberry pi の IPアドレス

~~~
$ go run main.go -ip xxx.xxx.xxx.xx

IP: xxx.xxx.xxx.xx

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.6.1
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on xxx.xxx.xxx.xx:3000
~~~

ネットワーク内にある他のマシンでブラウザを用いて [xxx.xxx.xxx.xx:3000] にアクセスすると Hello World と表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/bbc44131-2043-b187-ec52-109192a5e0a7.png)


他マシンから Name / Email を JSON 形式で送る 下記例は、Windows PC

~~~
curl -X POST http://xx.xx.xx.xx:3000/Users -H "Content-Type: application/json" -d "{\"Name\":\"MyName\",\"Email\":\"My.Email.address@test.ne.jp\"}"
~~~

---
 ☆2022年 1月11日(火) 午前11時00分 初版(Ver1.00) 作成
 ☆2022年 1月17日(月) 午後 2時35分 Ver1.10 : <他サーバーからデータを受信> を追加
 ☆2024年 9月04日(月) 午後 3時00分 Ver1.11 : 細かいミスを修正

---