文章结构:
结构体的声明初始化
结构体的操作
结构体的属性
结构体的使用场景
结构体
结构体是用户定义的类型,表示若干个字段(Field)的集合。有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体。
结构体的声明初始化
简要声明
type Employee struct { // 定义命令的结构体 firstName string lastName string age int } //定义匿名结构体 var employee struct { firstName, lastName string age int } //定义命名结构体 package main import ( "fmt" ) type Employee struct { firstName, lastName string age, salary int } func main() { //creating structure using field names emp1 := Employee{ firstName: "Sam", age: 25, salary: 500, lastName: "Anderson", } //creating structure without using field names emp2 := Employee{"Thomas", "Paul", 29, 800} fmt.Println("Employee 1", emp1.firstname ) //通过点来访问结构头内的属性。 fmt.Println("Employee 2", emp2) } 输出 Employee 1 {Sam Anderson 25 500} Employee 2 {Thomas Paul 29 800
结构体指针
同样能够&获取到结构体的指针。而结构体指针,要使用属性和方法时,需要通过*对变量先进行解引用才能够进行使用。 而go其
示例:
package main import ( "fmt" ) type Employee struct { firstName, lastName string age, salary int } func main() { emp8 := &Employee{"Sam", "Anderson", 55, 6000} fmt.Println("First Name:", (*emp8).firstName) fmt.Println("Age:", (*emp8).age) } 输出 First Name: Sam Age: 55 //结构体指针,直接使用变量名来进行访问。 package main import ( "fmt" ) type Employee struct { firstName, lastName string age, salary int } func main() { emp8 := &Employee{"Sam", "Anderson", 55, 6000} fmt.Println("First Name:", emp8.firstName) fmt.Println("Age:", emp8.age)
结构体的属性:
- 结构体同样是值类型。
- 结构体的零值,为字段的零值。int=0 string=“”
- 结构体比较,需要结构体中的字段类型也是可比较。
- 结构体字段小写,仅包内可访问
- 结构体的判等。结构体为值类型,判等需要字段内数据完全相等。
结构体使用权限
当结构体中的字段和方法首字母为小写的时候,那么这些方法和字段将仅支持在包内进行使用。而需要包外使用的字段和方法,首字母需要大写。
示例:
package computer type Spec struct { //exported struct Maker string //exported field model string //unexported field Price int //exported field } package main import "structs/computer" import "fmt" func main() { var spec computer.Spec spec.Maker = "apple" spec.Price = 50000 fmt.Println("Spec:", spec) }lohgph=f-fregxfhyop[]\ ';l,mnbvcxzaWSDEFGTHYJUKILO;' OJI9=--09-80760-76I543213`3
结构体的判等
结构体是值类型。如果它的每一个字段都是可比较的,则该结构体也是可比较的。如果两个结构体变量的对应字段相等,则这两个变量也是相等的。如果结构体包含不可比较的字段,则结构体变量也不可比较。
package main import ( "fmt" ) type name struct { firstName string lastName string } func main() { name1 := name{"Steve", "Jobs"} name2 := name{"Steve", "Jobs"} if name1 == name2 { fmt.Println("name1 and name2 are equal") } else { fmt.Println("name1 and name2 are not equal") } name3 := name{firstName:"Steve", lastName:"Jobs"} name4 := name{} name4.firstName = "Steve" if name3 == name4 { fmt.Println("name3 and name4 are equal") } else { fmt.Println("name3 and name4 are not equal") } }
结构体的使用:
- 嵌套结构体
- 提升字段
嵌套结构体(Nested Structs)
某个结构体中的某个字段是另外一个结构体
package main import ( "fmt" ) type Address struct { city, state string } type Person struct { name string age int address Address } func main() { var p Person p.name = "Naveen" p.age = 50 p.address = Address { city: "Chicago", state: "Illinois", } fmt.Println("Name:", p.name) fmt.Println("Age:",p.age) fmt.Println("City:",p.address.city) fmt.Println("State:",p.address.state) //通过.再使用潜入结构体的属性、方法。 } 输出: Name: Naveen Age: 50 City: Chicago State: Illinois
提升字段
当我们当结构体中嵌套了一个声明当结构体时,我们可以通过字段名称来引用。而如果我们使用匿名字段的形式引入其他结构体的时候。引入结构体的字段和方法就被提升了。提升为外层结构体的字段和方法。这样在使用的时候,就能够直接使用。
ps: 这和在go当中没有使用类和继承的属性结合。使用结构体和结构体方法完成类。 通过结构体的匿名字段的方式,来完成类型继承的功能。其中就包括匿名结构体的字段和方法会被提升到外层,直接使用。
示例:
package main import ( "fmt" ) type Address struct { city, state string } type Person struct { name string age int Address } func main() { var p Person p.name = "Naveen" p.age = 50 p.Address = Address{ city: "Chicago", state: "Illinois", } fmt.Println("Name:", p.name) fmt.Println("Age:", p.age) fmt.Println("City:", p.city) //city is promoted field fmt.Println("State:", p.state) //state is promoted field } 输出 Name: Naveen Age: 50 City: Chicago State: Illinois
小结:
- 结构体声明:声明时,会自动做初始化,默认值为烈性零值。
- 结构体声明:匿名结构体、匿名字段的使用,将按照字段类型来防范。
- 结构体指针引用,通过*提取指针值,同时允许以变量名直接引用。
- 结构体是值类型:结构体是值类型。结构体内部字段不限定类型。函数传递同样是以值类型传递。
- 结构体嵌套:如果结构体嵌套的结构体,以匿名方式。那么结构体的字段和方法都会被提升为外层结构体的字段和方法。使用将以本身结构体的使用方式进行使用。