---
# System prepended metadata

title: coding style

---

# coding style


API response example

```
{
  "status": "true", // "true/false"
  "code" : "200", // 200 成功 404 失敗
  "msg": "User closed the Payment Request UI.",
  "data": {
      "colA": "xxxx" ,
      "colB": "ooo" 
  } 
}
```

![](https://i.imgur.com/Cm3Ru7P.png)





## RESTful API

API，全名 Application Programming Interface (應用程式介面)，簡單來說，是品牌開發出的一種接口，讓第三方可以額外開發、應用在自身的產品上的系統溝通介面。



一般的 API，可能會是這樣：

* 獲得資料GET    /getData
* 新增資料POST   /createData
* 刪除資料DELETE /deleteData/1

若以 RESTful API 風格開發的話：

* 獲得資料GET     /data
* 新增資料POST    /data
* 刪除資料DELETE  /data/1

狀態碼又會再分為下幾種：

* 2xx = Success（成功）
* 3xx = Redirect（重定向）
* 4xx = User error（客戶端錯誤）
* 5xx = Server error（伺服器端錯誤）

備註：
在 HTTP 中，會有很多種 method 做為請求的方法，常用的幾個動作分別為：GET / POST / PUT / DELETE，正好會對應到資料庫基本操作 CRUD 增刪查改。

CRUD 為 Create(新增)、Read(讀取)、Update(更新)與Delete(刪除)的縮寫

參考文件：
https://medium.com/itsems-frontend/api-%E6%98%AF%E4%BB%80%E9%BA%BC-restful-api-%E5%8F%88%E6%98%AF%E4%BB%80%E9%BA%BC-a001a85ab638


## golang coding style


### 檔案命名規範
由於檔案跟包無任何關係， 而又避免windows大小寫的問題，所以推薦的明明規範如下：
檔名應一律使用小寫，不同單詞之間用下劃線分割, 命名應儘可能地見名知意


### 變數命名規範

* 變數明明用 camelcase來命名示例如下

```
const todayNews = "Hello"
```

* 如果超過了一個常量應該用括號的方法來組織

```
const (
systemName = "What"
sysVal = "dasdsada"
)
```


### 函式命名規範

* 由於Golang的特殊性（用大小寫來控制函式的可見性），除特殊的效能測試與單元測試函式之外, 都應該遵循如下原則

1. 使用駝峰命名
2. 如果包外不需要訪問請用小寫開頭的函式
3. 如果需要暴露出去給包外訪問需要使用大寫開頭的函式名稱


* 一個典型的函式命名方法如下：
```
// 註釋一律使用雙斜線， 物件暴露的方法
func (*fileDao) AddFile(file *model.File) bool {
result := db.NewRecord(*file)
if result {
db.Create(file)
}
return result
}
 
// 不需要給包外訪問的函式如下
func removeCommaAndQuote(content string) string {
re, _ := regexp.Compile("[\\`\\,]+")
return strings.TrimSpace(re.ReplaceAllString(content, ""))
}
```

### 介面命名規範 & Struct命名規範

* 介面命名也是要遵循駝峰方式命名， 可以用 type alias 來定義大寫開頭的type 給包外訪問

```
type helloWorld interface {
func Hello();
}

type SayHello helloWorld
```



### receiver 命名規範

* golang 中存在receiver 的概念 receiver 名稱應該儘量保持一致， 避免this, super，等其他語言的一些語義關鍵字如下

```
type A struct{}

func (a *A) methodA() {
}
func (a *A) methodB() {
a.methodA()
}
```

參考文件：
https://www.itread01.com/hkccxie.html
