go语言数组及结构体继承和初始化示例解析

目录
  • 分类
  • 数组
    • 数组定义
  • 结构体
  • 结构体继承
  • 结构体初始化
  • 成员的操作
  • 同名字段
  • 其它匿名字段
    • 非结构体类型
    • 结构体指针类型
  • 结构体字段实现接口

分类

类型 名称 长度 默认值 说明
pointer 指针   nil  
array 数组   0  
slice 切片   nil 引⽤类型
map 字典   nil 引⽤类型
struct 结构体      

数组

如果要存储班级里所有学生的数学成绩,应该怎样存储呢?可能有同学说,通过定义变量来存储。但是,问题是班级有80个学生,那么要定义80个变量吗?

像以上情况,最好是通过数组的方式来存储。

所谓的数组:是指一系列同一类型数据的集合。

数组定义

var a [10]int

数组定义也是通过var关键字,后面是数组的名字a,长度是10,类型是整型。表示:数组a能够存储10个整型数字。也就是说,数组a的长度是10。

我们可以通过len( )函数测试数组的长度,如下所示:

 var a [10]int
 fmt.Println(len(a)) //10

当定义完成数组a后,就在内存中开辟了10个连续的存储空间,每个数据都存储在相应的空间内,数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。

注意:数组的长度只能是常量。以下定义是错误的:

var n int = 10
var a [n]int

结构体

package main
import "fmt"
func main(){

	// 1.定义结构体
	type Student struct{
		id int
		name string
		age int
		addr string
}
	//2.结构体初始化1,值的顺序与结构体成员的顺序保持一致
	chary := Student{1,"chary",18,"上海"}
	fmt.Println(chary) //{1 chary 18 上海}
	//2.结构体初始化2,没有初始化的成员自动赋值0
	jeff := Student{name:"jeff"}  //{0 jeff 0 }
	fmt.Println(jeff)
	//3.成员使用
	chary.id = 100  //修改
	fmt.Println(chary.id )
	//4.结构体比较,两个结构体可以使用 == 或 != 运算符进行比较,但不支持 > 或 <。
	fmt.Println(jeff==chary) //false
	//5.同类型的两个结构体变量可以相互赋值。
	var user Student
	user = jeff
	fmt.Println(user) //{0 jeff 0 }
}

结构体继承

一般情况下,定义结构体的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。

当匿名字段也是一个结构体的时候,那么这个结构体所拥有的全部字段都被隐式地引入了当前定义的这个结构体。

//人
type Person struct {
    name string
    sex byte
    age int
}
//学生
type Student struct {
    Person    //匿名字段,那么默认Student就包含了Person的所有字段
    id int
    addr string
}

结构体初始化

//人
type Person struct {
    name string
    sex byte
    age int
}
//学生
type Student struct {
    Person//匿名字段,那么默认Student就包含了Person的所有字段
    id int
    addr string
}
func main() {
    //顺序初始化
    s1 := Student{Person{"mike",'m',18},1,"sz"}
    //s1 = {Person:{name:mike sex:109 age:18}id:1 addr:sz}
    fmt.Printf("s1=%+v\n",s1)
    //s2 := Student{"mike",'m',18,1,"sz"}//err
    //部分成员初始化1
    s3 := Student{Person:Person{"lily",'f',19},id:2}
    //s3 = {Person:{name:lily sex:102 age:19}id:2 addr:}
    fmt.Printf("s3=%+v\n",s3)
    //部分成员初始化2
    s4 := Student{Person:Person{name:"tom"},id:3}
    //s4 = {Person:{name:tomsex:0age:0}id:3addr:}
    fmt.Printf("s4=%+v\n",s4)
}

成员的操作

var s1 Student//变量声明
//给成员赋值
s1.name = "mike"//等价于s1.Person.name="mike"
s1.sex = 'm'
s1.age = 18
s1.id = 1
s1.addr = "sz"
fmt.Println(s1)    //{{mike 109 18}1 sz}
var s2 Student//变量声明
s2.Person = Person{"lily",'f',19}
s2.id = 2
s2.addr = "bj"
fmt.Println(s2)    //{{lily 102 19}2 bj}

同名字段

//人
type Person struct{
    name string
    sex byte
    age int
}
//学生
type Student struct{
    Person    //匿名字段,那么默认Student就包含了Person的所有字段
    id int
    addr string
    name string    //和Person中的name同名
}
func main(){
    var s Student//变量声明
    //给Student的name,还是给Person赋值?
    s.name = "mike"
    //{Person:{name:sex:0age:0}id:0addr:name:mike}
    fmt.Printf("%+v\n",s)
    //默认只会给最外层的成员赋值
    //给匿名同名成员赋值,需要显示调用
    s.Person.name = "yoyo"
    //Person:{name:yoyosex:0age:0}id:0addr:name:mike}
    fmt.Printf("%+v\n",s)
}

其它匿名字段

非结构体类型

所有的内置类型和自定义类型都是可以作为匿名字段的:

type mystr string//自定义类型
type Person struct {
    name string
    sex byte
    age int
}
type Student struct {
    Person    //匿名字段,结构体类型
    int    //匿名字段,内置类型
    mystr    //匿名字段,自定义类型
}
func main() {
    //初始化
    s1 := Student{Person{"mike",'m',18},1,"bj"}
    //{Person:{name:mikesex:109age:18}int:1mystr:bj}
    fmt.Printf("%+v\n",s1)
    //成员的操作,打印结果:mike,m,18,1,bj
    fmt.Printf("%s,%c,%d,%d,%s\n",s1.name,s1.sex,s1.age,s1.int,s1.mystr)
}

结构体指针类型

type Person struct {    //人
    name string
    sex byte
    age int
}
type Student struct {//学生
    *Person    //匿名字段,结构体指针类型
    id int
    addr string
}
func main() {
    //初始化
    s1 := Student{&amp;Person{"mike",'m',18},1,"bj"}
    //{Person:0xc0420023e0id:1addr:bj}
    fmt.Printf("%+v\n",s1)
    //mike,m,18
    fmt.Printf("%s,%c,%d\n",s1.name,s1.sex,s1.age)
    //声明变量
    var s2 Student
    s2.Person = new(Person)//分配空间
    s2.name = "yoyo"
    s2.sex = 'f'
    s2.age = 20
    s2.id = 2
    s2.addr = "sz"
    //yoyo10220220
    fmt.Println(s2.name,s2.sex,s2.age,s2.id,s2.age)
}

结构体字段实现接口

package main
import (
	"fmt"
	"sync"
)
type UserAges struct {
	ages map[string] int
	sync.Mutex
}
func (u *UserAges)Add(name string,age int)  {
	u.Lock()
	defer u.Unlock()
	u.ages[name] = age
}
func (u *UserAges)Get(name string)int{
	if age,ok:=u.ages[name];ok{
		return age
	}
	return -1
}
func main() {
	dic:=make(map[string]int)
	dic["age"] = 18
	r:=UserAges{ages: dic}
	r.Add("jeff",20)
	fmt.Println(r)
	age:=r.Get("age")
	fmt.Println(age)
}

以上就是go语言数组及结构体继承和初始化示例解析的详细内容,更多关于go语言数组及结构体继承和初始化的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go 结构体序列化的实现

    目录 更改JSON对象中的键 在JSON对象中隐藏结构体字段 附加内容 结构体标签string指令 本文,我们将回到之前写的showMovieHandler方法,并更新它以返回一个JSON响应,表示系统中的单个电影信息.类似于: {     "id": 123,     "title": "Casablanca",      "runtime": 102,      "genres": [        

  • golang 实现两个结构体复制字段

    实际工作中可能会有这样的场景: 两个结构体(可能类型一样), 字段名和类型都一样, 想复制一个结构体的全部或者其中某几个字段的值到另一个(即merge操作), 自然想到可以用反射实现 package main import "fmt" import "reflect" // 用b的所有字段覆盖a的 // 如果fields不为空, 表示用b的特定字段覆盖a的 // a应该为结构体指针 func CopyFields(a interface{}, b interface

  • go语言通过反射创建结构体、赋值、并调用对应的操作

    我就废话不多说了,大家还是直接看代码吧~ package main import ( "fmt" "reflect" "testing" ) type Call struct { Num1 int Num2 int } func (call Call) GetSub(name string){ fmt.Printf("%v 完成了减法运算,%v - %v = %v \n", name, call.Num1, call.Num2

  • golang 如何用反射reflect操作结构体

    背景 需要遍历结构体的所有field 对于exported的field, 动态set这个field的value 对于unexported的field, 通过强行取址的方法来获取该值(tricky?) 思路 下面的代码实现了从一个strct ptr对一个包外结构体进行取值的操作,这种场合在笔者需要用到反射的场合中出现比较多 simpleStrtuctField 函数接受一个结构体指针,因为最后希望改变其值,所以传参必须是指针.然后解引用. 接下来遍历结构体的每个field, exported字段是

  • go结构体嵌套的切片数组操作

    看代码吧~ package main import ( "fmt" ) type XCDataStu struct { Id int `json:"id" xorm:"id"` Name string `json:"name" xorm:"name"` } type XCDataStu1 struct { Id int `json:"id" xorm:"id"` St

  • go语言数组及结构体继承和初始化示例解析

    目录 分类 数组 数组定义 结构体 结构体继承 结构体初始化 成员的操作 同名字段 其它匿名字段 非结构体类型 结构体指针类型 结构体字段实现接口 分类 类型 名称 长度 默认值 说明 pointer 指针   nil   array 数组   0   slice 切片   nil 引⽤类型 map 字典   nil 引⽤类型 struct 结构体       数组 如果要存储班级里所有学生的数学成绩,应该怎样存储呢?可能有同学说,通过定义变量来存储.但是,问题是班级有80个学生,那么要定义80

  • 使用Python向C语言的链接库传递数组、结构体、指针类型的数据

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来调用C语言的代码库. 至于如何调用基础数据类型的数据,请大家参考我的另外一篇文章:Python使用ctypes调用C/C++的方法 1. 使用python给C语言函数传递数组类型的参数 想必很多时候,C语言会使用数组作为参数,在之前我们使用过ctypes的一些数据类型作为C语言参数类型,包括byte

  • C语言新手练习之多维数组、结构体及函数

    1887 颜色精简 题目: 有一个颜色集合,里面有若干个颜色值(RBG系统表示).现在有若干个颜色值需要映射到集合中的某个值.具体的映射方法是找到集合中和它的颜色距离最小的进行映射.在RGB颜色系统中,颜色用 (R,G,B) 三元组表示,R,G,B是0到255之间的整数.两个颜色之间的距离定义如下:假设给定两个颜色的三元组分别是 (Ra,Ga,Ba) 和 (Rb,Gb,Bb) ,那么他们之间的距离 输入: 先输入一个整数n(1<=n<=20),表示集合中有多少种颜色. 接下来n行给出集合中的颜

  • C#语言基础——结构体和枚举类型全面解析

    一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承. 用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等.这可以节省内存,因为没有如类对象所需的那样有额外的引用产生.例如,当声明含有成千上万个对象的数组时,这会引起极大的差异. 结构体是一个变量组,将一组变量放在一起,其实就是一个自定义

  • Go语言学习之结构体和方法使用详解

    目录 1. 结构体别名定义 2. 工厂模式 3. Tag 原信息 4. 匿名字段 5. 方法 1. 结构体别名定义 变量别名定义 package main import "fmt" type integer int func main() { //类型别名定义 var i integer = 1000 fmt.Printf("值: %d, 类型: %T\n", i, i) var j int = 100 j = int(i) //j和i不属于同一类型,需要转换 fm

  • 浅谈Go语言中的结构体struct & 接口Interface & 反射

    结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struct类型理解为类,可以定义方法,和函数定义有些许区别: struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var user2 *User = new(User) struct使用 下面示例中user1和

  • C语言中结构体与内存对齐实例解析

    1.结构体类型 C语言中的2种类型:原生类型和自定义类型,结构体类型是一种自定义类型. 2.结构体使用时先定义结构体类型再用类型定义变量 -> 结构体定义时需要先定义结构体类型,然后再用类型来定义变量. -> 也可以在定义结构体类型的同时定义结构体变量. // 定义类型 struct people { char name[20]; int age; }; // 定义类型的同时定义变量. struct student { char name[20]; int age; }s1; // 将类型st

  • C语言 structural body结构体详解用法

    目录 结构体 结构体类型的声明 举个现实例子 程序实例 结构体成员的类型: 结构体变量的定义和初始化 程序一 结构体嵌套情况下,初始化和定义 结构体成员的访问 结构体传参 程序一: 程序二 结构体 结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量 结构体类型的声明 创建 结构体类型 没有占 内存空间,因为还 没有 创建变量 举个现实例子                 盖房子 图纸 --------------------> 房子 结构体类型        结构体变量

  • Go语言学习函数+结构体+方法+接口

    目录 1. 函数 1.1 函数返回值 同一种类型返回值 带变量名的返回值 函数中的参数传递 函数变量 1.2 匿名函数——没有函数名字的函数 在定义时调用匿名函数 将匿名函数赋值给变量 匿名函数用作回调函数 可变参数——参数数量不固定的函数形式 1.3 闭包 1.4 defer语句 处理运行时发生的错误 1.5 宕机恢复(recover)——防止程序崩溃 2. 结构体 2.1 定义与给结构体赋值 3. 方法 3.1 结构体方法 3.2 接收器 指针接收器 非指针类型接收器 4. 接口 4.1 声

  • C语言全面梳理结构体知识点

    目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体变量的初始化 五.结构体变量的赋值 六.引用结构体变量中的成员 七.结构体变量的传参问题 八.传输地址带来的问题 九.动态结构体数组 十.关键字typedef 十一.C++中的引用 一.什么是结构体 为了更好地模拟现实,需要把各种基本数据类型组合在一起构成一种新的复合数据类型,我们把这种自定义的数据类型称为结构体.结构体是程序员根据实际需求,把各种基本数据类型组合在一起构成的一种新的复合数据类型. 二.结构体的定义 结构体

随机推荐