go 结构体struct

访问控制机制

如果一个结构体的成员变量名称是首字母大些的,那么这个变量是可导出的(即在其他包可以访问到)。 一个结构体可以同时包含可导出和不可导出的成员变量

type A struct {
    Hour int    //可导出
    minute int  //不可导出
}

限制

命名结构体类型s不可以定义一个拥有相同结构体类型s的成员变量,也就是一个聚合类型不可以包含它自己。但是s中可以定义一个s的指针类型,即*s。

type B struct {
    value int
    //Next B   //错误
    Next *B    //正确
}

初始化

//第一种,在Go语言中,可以直接以 var 的方式声明结构体即可完成实例化
var t T
t.a = 1
t.b = 2

//第二种,使用 new() 实例化
t := new(T)

//第三种,使用字面量初始化
t := T{a, b}
t := &T{} //等效于 new(T)
三种方式区别

3

嵌套

package main 
import "fmt"
 
type Base struct {
	bx int
	by int
}
 
type Student struct {
	Base
	x int
	y int
}
 
func main() {
	s := new(Student)
	s.bx = 1
	s.by = 100
	s.x = 2
	s.y = 3
 
	s1 := Student{Base{1, 100}, 2, 3}
	fmt.Println(s, s1)
}

函数和方法

type typeName struct {
    var1 Type
    var2 Type
    ...
    varn Type}

定义函数:

func funcName (param Type ...) returnType {}

定义方法:

func (t Type) methodName (param Type...) returnType {}

两者的区别:

  • 方法中在func关键字和方法名之间多了一个接收者类型。
  • 函数属于包不属于结构体,通过包调用函数,而方法属于结构体,通过结构体变量调用

方法使用值和指针

使用值

//Learn_Go/main.go
package main
 
import "fmt"
 
type People struct {
    Name string
    Weight int
}
 
func (p People) run() {
    fmt.Println(p.Name,"正在跑步,当前体重为:",p.Weight)
}
 
func main()  {
    peo := People{"derek",120}
    peo.run()       //derek 正在跑步,当前体重为: 120
}

使用指针

要修改结构体的值用指针

package main
 
import "fmt"
 
type People struct {
    Name string
    Weight int
}
 
func (p *People) run() {
    fmt.Println(p.Name,"正在跑步,当前体重为:",p.Weight)
    //运行一次run方法,体重减去1
    p.Weight -= 1
}
 
func main()  {
    peo := People{"derek",120}
    peo.run()       //derek 正在跑步,当前体重为: 120
    fmt.Println("跑完步后的体重为:",peo.Weight)        //跑完步后的体重为: 119
}

结构体标签

结构体的字段除了名字和类型外,还可以有一个可选的标签(tag):它是一个附属于字段的字符串,可以是文档或其他的重要标记。这类似于Java中为类的属性添加的注解。

例如:

type User struct {
    UserId   int    `json:"user_id" bson:"user_id"`
    UserName string `json:"user_name" bson:"user_name"`
}
u := &User{UserId: 1, UserName: "tony"}
j, _ := json.Marshal(u)
fmt.Println(string(j))
// 输出内容:{"user_id":1,"user_name":"tony"}
//如果在属性中不增加标签说明,则输出:{"UserId":1,"UserName":"tony"}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×