欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Go-struct

程序员文章站 2022-07-10 08:21:34
...

结构体:将0个或多个任意类型的命名变量组合在一起的聚合数据类型。

如:

type Employee struct{

    ID int
    Name string
    Address string
    DoB time.Time
    Position string
    Salary int
    ManagerId int
}

var dilbert Employee

//成员访问
dilbert.Salary -= 5000

//获取成员变量的地址,然后通过指针访问
position := &dilbert.Position
*position = "Senior" + *position

//点号作用在结构体指针上
var employeeOfTheMonth *Employee = &dilbert
employeeOfTheMonth.Position += "(proctive team player)"

聚合类型S不可以包含它自己,但S中可以定义一个S的指针类型,即*S,可以创建一些递归的数据类型,如:链表、树。

type tree struct{
    value int
    left,right *tree
}


func add(t *tree, value int) *tree{

    if t == nil{
        //等价于返回&tree{value,value}
        t = new(tree)
        t.value = value
        return t
    }

    if value < t.value{
        t.left = add(t,left, value)
    }else{  
        t.right = add(t.right, value)
    }
}


//将元素按顺序追加到values里面,然后返回slice

func appendValues(values []int, t *tree)[]int{

    if t != nil{
        values = appendValues(values, t.left)
        values = append(values, t.vallue)
        values = appendValues(values, t.right)
    }

    return values
}

结构体字面量的两种格式

(1)type Point struct{X,Y int} P := Point{1,2} //按成员变量正确顺序

(2)通过指定部分或全部成员变量的名称,如果某个成员变量没有指定,它的值是该成员变量的零值

   P := Point{X:1}

如果结构体没有任何成员的话就是空结构体,写作struct{}。它的大小为0,也不包含任何信息,但是有时候依然是有价值的。有些Go语言程序员用map带模拟set数据结构时,用它来代替map中布尔类型的value,只是强调key的重要性,但是因为节约的空间有限,而且语法比较复杂,我们通常避免避免这样的用法。

seen := make(map[string]struct{}) // set of strings
// ...
if _, ok := seen[s]; !ok {
    seen[s] = struct{}{}
    // ...first time seeing s...
}

结构体可以作为函数的参数和返回值,如果结构体较大,一般使用指针参数,而且如果要在函数修改结构体,则必须使用指针形式。go语言中所有的函数参数都是值拷贝。

func Bonus( e *Employee, percent int) int{
    return e.Salary * percent / 100
}

func AwardAnnualRaise (e *Employee){ //接收的是实参的副本
    e.Salary = e.Salary * 105 / 100
}

pp := &Point{1, 2} <==> pp := new{Point} *pp = Point{1,2}

如果结构体的全部成员都是可比较的,则该结构体也可比较,则可作为Map的key类型。比较实用 == 或 !=

 

 

 

 

 

 

 

 

 

 

 

相关标签: struct

推荐阅读