前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang之旅13-struct1

Golang之旅13-struct1

作者头像
皮大大
发布2021-03-02 14:30:16
2890
发布2021-03-02 14:30:16
举报
文章被收录于专栏:机器学习/数据可视化

结构体

Go中没有类的概念,不支持面向对象OOPGo语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。Go语言中通过struct来实现面向对象。 结构体是复合类型,由一系列属性组成,每个属性都有自己的类型和值,结构体通过属性把数据聚集在一起。 结构体是值类型,可以通过new函数进行创建。

Go语言之结构体

类型自定义

Go中的基本数据类型有string、整型、浮点型、布尔型等,类型可以自定义,通过type关键字实现:

代码语言:javascript
复制
type MyInt int    //将MyInt 定义为int类型,它具有int类型的特性

类型别名

别名定义

类型别名规定TypeAliasType的别名。比如byteuint8 的别名,runeint32的别名,别名的定义

代码语言:javascript
复制
type TypeAlias = Type

//栗子
type byte = uint8
type rune = int32
类型别名和类型定义的区别

在定义上二者只是差在一个等号上面

代码语言:javascript
复制
type NewInt int    //类型定义

type MyInt = int   //类型别名

func main() {
	var a NewInt
	var b MyInt
	
	fmt.Printf("type of a:%T\n", a) //type of a:main.NewInt
	fmt.Printf("type of b:%T\n", b) //type of b:int
}

结构体

定义结构体使用的是typestruct语句。

  • struct 语句定义一个新的数据类型,结构体有中有一个或多个成员
  • type 语句设定了结构体的名称,用来自定义一个全新的类型
  • 结构体内部占用连续的一块内存,格式如下:
代码语言:javascript
复制
type 类型名 struct {
    field1 type1   //字段名 字段类型
    field2 type2
    _ type3   //用不到的字段用_表示  
    field2 type4  
    …
}

//空结构体创建
struct {}
  • 类型名:标识自定义结构体的名称,在同一个包内不能重复
  • 字段类型:表示结构体字段的具体类型
  • 字段名:结构体的字段名,结构体中的字段名不能重复,必须唯一
  • 字段名称可以显式或者隐式指定,没有显式字段名称的字段称为匿名字段
  • 用不到的字段,用_表示

看一个具体的栗子:关于Person的结构体

代码语言:javascript
复制
type person struct {
	name string
	city string
	age  int8
}

// 同样类型的字段可以在同一行
type person1 struct {
	name, city string
	age        int8
}
  • 结构体中的一个字段用来描述一个值或者某个属性
  • 结构体是用来描述一组值的,是一种聚合型的数据类型。

初始化和实例化结构体

初始化结构体

没有初始化的结构体,其成员变量都是对应其类型的零值。

  • 键值对初始化
  • 值的列表进行初始化
  • 最后一个字段后面的逗号一定要带上
代码语言:javascript
复制
package main

import "fmt"

type Books struct {
    //title, author, subject string   类型相同可以写到一行
	title string
	author string
	subject string
	book_id int8
}

func main(){
	//1、直接写出对应的字段的值values
    //必须初始化结构体的所有字段
    //填充顺序和字段在结构体中的顺序相同
    //不能和键值对的方式混合使用
	fmt.Println(Books{
		"go 语言",
		"小明",
		"go 教程",
		1})

	//2、通过keys-values进行创建
	fmt.Println(Books{
		title: "go 语言",
		author: "小明",
		subject: "go 教程",
		book_id: 1})

	// 3、忽略的字段为 0 或 空
	fmt.Println(Books{
		title: "Go 语言",
		author: "小明"})
    
    p := &Books{
		title: "go 编程",
		author: "Peter",    //逗号一定要带上
	}
	fmt.Printf("%#v\n", p)
}
实例化和匿名结构体

只有当结构体实例化时,才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。结构体本身也是一种类型,可以通过关键字var来声明结构体类型。类比Python的中类和类的实例化。

代码语言:javascript
复制
package main

import "fmt"

//定义结构体
type person struct {
	name string
	city string
	email string
	age int8
}

func main(){
	var p1 person   //实例化结构体
	p1.name = "小明" //访问结构体中的字段,通过.来实现
	p1.city = "深圳"
	p1.email = "123456@qq.com"
	p1.age = 20

	fmt.Printf("p1=%v\n", p1)   //%v打印的数据更清晰
	fmt.Printf("p1=%#v\n", p1)
    fmt.Println(p1.name)   //直接通过结构体的属性
	fmt.Println(p1.age)
    
    
    //匿名结构体:临时使用
	var user struct{
		name string
		married bool
	}
	user.name = "张三"
	user.married = false
	fmt.Printf("%#v\n", user)
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-9-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结构体
  • 类型自定义
  • 类型别名
    • 别名定义
      • 类型别名和类型定义的区别
      • 结构体
      • 初始化和实例化结构体
        • 初始化结构体
          • 实例化和匿名结构体
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档