###### tags: `Golang`
# 常數與函式
## 常數宣告
用法跟js一樣啦
```go=
const e = 2.17
const (
a = 21
b = 9527
)
```
## 列舉常數
「iota」是一個常數計數器,往下逐漸累加,也可加入表達式
```go=
type Hero int
type Car int
const(
Iron Hero = iota
Drstange
Thor
Hulk
)
const(
mustang Car = iota*2 +1
lanbojini
jaguar
Benz
)
fmt.Println(Iron, Drstange, Thor, Hulk)
// 0 1 2 3
fmt.Println(mustang, lanbojini, jaguar, Benz)
// 1 3 5 7
```
## 函式宣告
### 一般宣告
格式:func 「函式名」(參數1 型別,參數2 型別)回傳型別{}
```go=
func foo(a int,b string)string{
return fmt.Sprintf("%d %s",a,b) //Sprint 將參數格式化
}
func main(){
s := foo(2020,"Iron Man")
fmt.Println(s)
}
```
### 回傳多值
```go=
func foo(a int ,b string)(string,int){
return b+"2",a+2
}
func main(){
b,a:= foo(2020,"Iron")
fmt.Printf("%d %s\n",a,b)
}
// 2022 Iron2
```
### 簡化寫法
參數類型相同時可使用
```go=
func foo(a,b int)string{}
```
### 命名回傳值
被命名的回傳值(name & year)等於宣告了回傳變數,結束時return會自動回傳該內容
```go=
func foo(a int, b string) (name string, year int) {
name = "name: " + b
year = a + 2
return
}
func main() {
b, a := foo(2020, "Iron")
fmt.Printf("%d %s\n", a, b)
}
```
### 函式變數
只有符合函式變數條件的才可被賦值
foo的條件為2個int參數1個int回傳值,同為以上條件的函式才可賦值給它
比如addAndMinus就不符合
```go=
func add(a, b int) int {
return a + b
}
func minus(a, b int) int {
return a - b
}
func addAndMinus(a, b int) (int, int) {
return a + b, a - b
}
func main() {
var foo func(a, b int) int
foo = add
//foo = minus
a := foo(1, 2)
fmt.Printf("%d\n", a)
// 3
}
```
### 匿名函數
```go=
func foo(a,b int,f func(a,b int)int)int{
return f(a,b)
}
func main(){
var add = func(a,b int) int{
return a+b
}
a:=foo(1,2,add)
fmt.Printf("%d\n",a)
// 3
}
```
# Dark Theme CSS
{%hackmd theme-dark %}