Go语言学习(六)

阅读: 评论:0

Go语言学习(六)

Go语言学习(六)

目录

4.1结构体初始化

4.2 结构体切片

4.3 匿名字段


Go 语言中数组切片可以存储同一类型的数据,那当我们需要存储一些不同数据类型的集合时候该怎么办呢?自然而然的就引出了 结构体 。在结构体中可以为不同项定义 不同的数据类型 。结构体是由一系列具有不同类型的数据构成的数据集合。
type 结构体名 struct { 结构体成员名 数据类型 结构体成员名 数据类型 结构体成员名 数据类型 
}

要注意结构体成员在定义时不能够直接赋值!

比如我们可以定义一个学生结构体,要求存储姓名、年龄、性别、分数、地址这些信息。

type student struct {name  stringage   intsex   stringscore intaddr  string
}

4.1结构体初始化

结构体在定义之后也需要定义结构体变量,他也是一种数据类型,只不过这个数据类型比较特殊,是我们自己定义的数据类型。

//结构体变量
var 结构体变量名 结构体数据类型 
在定义结构体变量后可以为结构体成员进行初始化
var zhangsan student = student{"张三", 18, "男", 100, "上海"}

然后就可以对我们的结构体变量进行操作啦!

完整实例:

package mainimport "fmt"type Books struct {title  stringauthor stringprice  float32
}func main() {book := Books{title:  "c语言教程",author: "谭浩强",price:  123.4,}fmt.Printf(book.title)fmt.Printf(book.author)fmt.Printf("%f", book.price)print("=========================")var book1 Booksvar book2 Booksbook1.title = "1111"book1.author = "zhangsan"book1.price = 12.33book2.title = "2222"book2.author = "lisi"book2.price = 14.44/* 打印 Book1 信息 */fmt.Printf("Book 1 title : %sn", book1.title)fmt.Printf("Book 1 author : %sn", book1.author)fmt.Printf("Book 1 price : %dn", &book1.price)/* 打印 Book2 信息 */fmt.Printf("Book 2 title : %sn", book2.title)fmt.Printf("Book 2 author : %sn", book2.author)fmt.Printf("Book 2 price : %fn", book2.price)
}

4.2 结构体切片

定义结构体变量只能存储一条结构体信息,但是当我们有存储多个信息的时候该怎么处理呢?自然就引出了结构体数组或者切片。

//结构体切片 
var 结构体切片名 []结构体数据类型
//例如
var students []Stu//Stu是一个结构体类型
/*type Stu struct {name  stringage   intsex   stringscore intaddr  string
}*/

代码实例:

package mainimport ("fmt"
)type Stu struct {name stringage  intsex  string
}func main() {var students []Stu = []Stu{Stu{name: "tom", age: 18, sex: "男"},Stu{name: "jack", age: 18, sex: "男"},Stu{name: "rose", age: 18, sex: "女"}}fmt.Printf("%vn", students)//切片扩容students = append(students, Stu{"李四", 16, "男"})fmt.Printf("%v", students)//遍历打印for _, student := range students {fmt.Printf("%v", student)}
}

4.3 匿名字段

可以通过匿名字段实现 “ 继承关系 ” ,所谓的匿名字段就是 将结构体名称作为另外结构体的成员 。 虽然在go中没有所谓的OOP,没有这些封装继承多态但是可以通过一些“手段”来实现类似的效果,看上去就像是OOP一样。至于“多态”就在后面的学习笔记中提到。
  • 当“子类”结构体将“父类”结构体作为匿名结构体放在“肚子”里的时候,“子类”就会自动获得父类的“属性”
package mainimport "fmt"//子类和父类有共同的成员名
type People struct {Name stringAge  int
}type Student1 struct {//匿名字段 将结构体作为另外一个结构体成员PeopleScore int
}func main() {stu := Student1{People{"兵哥", 18},  100}//注意这里我们可以直接在stu下.出来我们的Name属性 其实这是go语言的一种优化吧//在使用的时候就省去了stu.people.Name的繁琐操作 在使用的时候就像我们熟悉的继承机制fmt.Println(stu.Name)
}
  • 当“子类”中有父类同样的属性的时候我们在访问的时候采取的是就近原则也就是访问的是我们在子类中定义的属性,而“父类”的属性。

注意:这里我说说的“子类”、“父类”只是为了方便理解、有利于表达来的,在go中是没有这些概念的。

到这里是不是觉得我们的go语言也很有趣呢?OOP也还没有介绍完呢。在介绍完方法之后还会有更有趣的“重写”。

本文发布于:2024-01-29 10:35:57,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170649576014678.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:语言
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23