当我们要表示同一种数据类型时候,可以用到数组,切片和字典。 当我们要表示不同的数据类型呢?这时候就要用到结构体了
一:定义struct
关键字 type 和 struct 来定义结构体
type student struct { name string age int }
二:struct赋值
var stu student stu.name = "Tom" stu.age = 10 fmt.Printf("name %s, age: %d", stu.name, stu.age)
除了上面,还有下面几种方式:
1.提供顺序初始化
stu := person{"Tom", 20}
2.通过field:value的方式初始化,可以是任意顺序
stu := person{"age":20, "name":"Tom"}
3:也可以通过new分配指针
stu := new(person)
完整例子:
package main import "fmt" type person struct { name string age int } func main() { var stu person //赋值初始化 stu.name, stu.age = "Tom", 23 //根据field:value初始化 jimmy := person{age: 34, name: "jimmy"} //按照顺序初始化 mike := person{"mike", 23} fmt.Println(stu.name, jimmy.name, mike.name, jimmy.age, mike.age) }
三:结构体传递参数
package main import "fmt" //结构体传递参数 type Rect struct { with, length float64 } func double_area(rect Rect) float64 { rect.with *= 2 rect.length *= 2 return rect.with * rect.length } func main() { var rect = Rect{20, 30} area := double_area(rect) fmt.Println(area) }
四:结构体函数
上面我们在main函数计算了双倍矩形面积,但是double_area不能作为 Rect 的方法实现,而是将Rect对象作为参数传给了函数计算,还有没有其他方法实现呢,当然有
package main import "fmt" type Rect struct { with, length float64 } func (r Rect) double_area() float64 { r.with *= 2 r.length *= 2 return r.with * r.length } func main() { var rect = Rect{20, 30} fmt.Println(rect.double_area()) }
五: 结构体内嵌类型
我们可以在一个结构体内部定义一个结构体类型的成员
package main import "fmt" type Phone struct { price int color string } type IPhone struct { phone Phone model string } func main() { var p IPhone p.phone.price = 5000 p.phone.color = "red" p.model = "ipone 6s" fmt.Println("Price:", p.phone.price) fmt.Println("Color:", p.phone.color) fmt.Println("Model:", p.model) }
六:struct匿名字段
上面我们定义了一个嵌套结构体, 实际上go也提供一种不写名字嵌套的结构体,也就是匿名字段
package main import "fmt" type Phone struct { price int color string } type IPhone struct { Phone //匿名字段,那么默认IPhone就包含了Phone所有字段 model string } func main() { var p IPhone p.Phone.price = 7000 //直接 p.Phone.price 赋值 p.Phone.color = "glod" p.model = "ipone 7p" fmt.Println("Price:", p.Phone.price) fmt.Println("Color:", p.Phone.color) fmt.Println("Model:", p.model) }