*本文笔记参考:b站【尚硅谷】Golang入门到实战教程
张老太养了两只猫:一只名字叫小白,今年3岁,白色;另一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字、年龄、颜色;如果用户输入的小猫名错误,则显示张老太没有这只猫。
1、结构体
-
将一类事务的特性提取出来(比如猫类),形成一个新的数据类型,就是一个结构体;
-
通过这个结构体,我们可以创建多个变量(实例/对象);
-
事务可以是猫类,也可以是person或其他。
package main
import "fmt"
//定义一个Cat结构体
type Cat struct {
Name string
Age int
Color string
}
func main() {
//创建一个Cat的变量
cat1 := Cat{"小白", 3, "白色"}
cat2 := Cat{"小花", 100, "花色"}
fmt.Println(cat1, cat2)
}
//输出
//{小白 3 白色} {小花 100 花色}
1)结构体的声明
type 结构体名称 struct {
field1 type
field2 type
}
2)字段/属性
注意事项和细节说明:
-
从概念或叫法上看,结构体字段=属性=field;
-
字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型;
-
在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值):
-
bool类型是false,数值是0,字符串是"";
-
数组类型的默认值和它的元素类型有关,如score [3]int则为[0,0,0];
-
指针、slice和map的零值都是nil,即还没有分配空间(map和slice使用之前一定要先make);
package main import "fmt" //定义一个Cat结构体 type Cat struct { Name string Age int Scores [5]float64 Color []string //切片 Ptr *int // 指针 Map1 map[string]string //map } func main() { var cat Cat fmt.Println(cat) } //输出 //{ 0 [0 0 0 0 0] [] <nil> map[]}
-
-
不同结构体的字段是独立、互不影响的,如果结构体字段的类型是值类型,则该结构体中字段值的改变不会影响到其他结构体;如果结构体字段的类型是引用类型,则该结构体中字段值的改变会导致其他结构体字段值发生改变。
package main import "fmt" //定义一个Cat结构体 type Cat struct { Name string Age int Color []string //切片 } func main() { var cat1 Cat cat1.Name = "小白" cat1.Age = 3 cat1.Color = make([]string, 1) cat1.Color[0] = "白色" fmt.Println("cat1:", cat1) cat2 := cat1 //Name为值类型,cat2.Name的改变不会影响到cat1.Name cat2.Name = "小花" //Color为引用类型,会导致cat1.Color的值也发生改变 cat2.Color[0] = "花色" fmt.Printf("cat1: %v\ncat2: %v", cat1, cat2) } //输出: //cat1: {小白 3 [白色]} //cat1: {小白 3 [花色]} //cat2: {小花 3 [花色]}
3)创建结构体变量和访问结构体字段
方式1:直接声明
var cat1 Cat
方式2:{}
var cat1 = Cat{} //用var声明
cat1 := Cat{} //自动推导
cat1 := Cat{"tom", 3} //直接在{}中赋值
方式3:new
var cat1 *Cat = new(Cat) //cat1为一个指针
cat1.Name = "tom" //等价于(*cat1).Name = "tom"
cat1.Age = 3 //等价于(*cat1).Age = 3
方式4:&
var cat1 *Cat = &Cat{} //cat1为一个指针
cat1.Name = "tom" //等价于(*cat1).Name = "tom"
cat1.Age = 3 //等价于(*cat1).Age = 3
说明:
-
方式3和方式4返回的是结构体指针;
-
结构体指针访问字段的标准方式是应该
(*结构体指针).字段名
,比如(*cat1).Name
,但go做了一个简化,也支持结构体指针.字段名
,比如cat1.Name
,g