golang知识点-结构体

文章结构:

结构体的声明初始化

结构体的操作

结构体的属性

结构体的使用场景

结构体

结构体是用户定义的类型,表示若干个字段(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

小结:

  • 结构体声明:声明时,会自动做初始化,默认值为烈性零值。
  • 结构体声明:匿名结构体、匿名字段的使用,将按照字段类型来防范。
  • 结构体指针引用,通过*提取指针值,同时允许以变量名直接引用。
  • 结构体是值类型:结构体是值类型。结构体内部字段不限定类型。函数传递同样是以值类型传递。
  • 结构体嵌套:如果结构体嵌套的结构体,以匿名方式。那么结构体的字段和方法都会被提升为外层结构体的字段和方法。使用将以本身结构体的使用方式进行使用。

转载于:https://my.oschina.net/u/4156317/blog/3073953

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值