一、 结构体
结构体 (Struct) 指的是一种数据结构, 由一系列具有相同类型或不同类型的数据构成的数据集合. 类似其他语言中的 Class.
定义
type 类型名 struct {
字段名 字段类型
字段名 字段类型
…
}
类型名:标识自定义结构体的名称,在同一个包内不能重复。
字段名:表示结构体字段名。结构体中的字段名必须唯一。
字段类型:表示结构体字段的具体类型。
实例
type person struct {
name string
city string
age int8
}
func main() {
var p1 person
p1.name = "沙河娜扎"
p1.city = "北京"
p1.age = 18
fmt.Printf("p1=%v\n", p1) //p1={沙河娜扎 北京 18}
fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"沙河娜扎", city:"北京", age:18}
}
二、函数
func 函数名( [参数列表] ) [返回值类型] {
函数体
}
1、func: 函数由 func 开始声明, 类似 python 的 def
2、函数名: 函数的名称, 函数名和参数列表一起构成了函数签名
3、参数列表: 参数就像一个站位符. 参数列表制定的是参数类型, 顺序, 以及参数个数.
4、返回值类型: 函数返回一列值的数据类型. 不是必须的
package main
import (
"fmt"
"strconv"
)
//const 来定义枚举类型
const (
//可以在const() 添加一个关键字 iota, 每行的iota都会累加1, 第一行的iota的默认值是0
BEIJING = iota //iota = 0
SHANGHAI //iota = 1
SHENZHEN //iota = 2
)
const (
a, b = iota+1, iota+2 // iota = 0, a = iota + 1, b = iota + 2, a = 1, b = 2
c, d // iota = 1, c = iota + 1, d = iota + 2, c = 2, d = 3
e, f // iota = 2, e = iota + 1, f = iota + 2, e = 3, f = 4
g, h = iota * 2, iota *3 // iota = 3, g = iota * 2, h = iota * 3, g = 6, h = 9
i, k // iota = 4, i = iota * 2, k = iota * 3 , i = 8, k = 12
)
func fun1(a string, b int) int {
fmt.Println("a = ", a)
fmt.Println("b = ", b)
b,error := strconv.Atoi(a)
if error != nil{
fmt.Println("字符串转换成整数失败")
}
b = b + 1
fmt.Println(b)
return b
}
//返回多个返回值,匿名的
func fun2(a int, b string) (string, int) {
fmt.Println("a = ", a)
fmt.Println("b = ", b)
d := strconv.Itoa(a) //数字变成字符串
d = d + "sdfs"
fmt.Println(d)
e,error := strconv.Atoi(b) //字符串转换成整数
if error != nil{
fmt.Println("字符串转换成整数失败")
} else {
fmt.Println(e)
}
return d, e
}
//返回多个返回值, 有形参名称的
func fun3(a string, b int) (r1 string, r2 int) {
fmt.Println("---- foo3 ----")
fmt.Println("a = ", a)
fmt.Println("b = ", b)
//r1 r2 属于foo3的形参, 初始化默认的值是0
//r1 r2 作用域空间 是foo3 整个函数体的{}空间
fmt.Println("r1 = ", r1)
fmt.Println("r2 = ", r2)
//给有名称的返回值变量赋值
r1 = a
r2 = 2000
return
}
func main() {
//常量(只读属性)
const length int = 10
fmt.Println("length = ", length)
//length = 100 //常量是不允许修改的。
fmt.Println("BEIJIGN = ", BEIJING)
fmt.Println("SHANGHAI = ", SHANGHAI)
fmt.Println("SHENZHEN = ", SHENZHEN)
fmt.Println("a = ", a, "b = ", b)
fmt.Println("c = ", c, "d = ", d)
fmt.Println("e = ", e, "f = ", f)
fmt.Println("g = ", g, "h = ", h)
fmt.Println("i = ", i, "k = ", k)
// iota 只能够配合const() 一起使用, iota只有在const进行累加效果。
c := fun1("666", 555)
fmt.Println("c = ", c)
ret1, ret2 := fun2(1000, "999")
fmt.Println("ret1 = ", ret1, " ret2 = ", ret2)
ret1, ret2 = fun3("foo3", 333)
fmt.Println("ret1 = ", ret1, " ret2 = ", ret2)
}
三、函数闭包
- Go 语言支持匿名函数, 可作为闭包. 匿名函数是一 “内嵌” 语句或表达式.
- 匿名函数的优越性在于可以直接使用函数内的变量, 不必声明
package main
import "fmt"
func main() {
// 匿名函数
var add = func(a int, b int) int {
return a + b
}
// 调试输出
fmt.Println(add(1, 2))
}