创建 struct 实例指定字段值 | 学习笔记

简介: 快速学习创建 struct 实例指定字段值

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程创建 struct 实例指定字段值】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/626/detail/9684


创建 struct 实例指定字段值

 

内容介绍:

一、内容说明

二、创建 struct 实例指定字段值的方式

 

一、内容说明

整个 Golang 在创建结构体实例(变量)时,可以直接指定字段的值。

 

二、创建 struct 实例指定字段值的方式

对一个结构体变量,我们有两种方式进行指定字段的值,第一种方式就是按照字的顺序给结构体变量赋值。比如说 student1,就可以写作 student{},然后分别写入第一个字段的值 Name(tom) 以及第二个字段的值 Age(10)。第二种可以利用类型推倒,前面不用写 var,直接写作 student,然后按照字段赋值,并交给 student2。另外一种更简捷的方式、更明确的方式,就是在创建一个结构体变量时,我们也可以在前面指定这个字段的名字,后面输入相应的值,此时应特别注意在最后加上逗号,然后也可以通过类型推导,直接把传入值的结构体交给一个指定的变量。

1.方式1

在 chapter10 中新建一个文件夹,命名为 structassign,然后新建一个 main.go 文件。输入共用代码:

package main

import (

"fmt"

type stu struct {},该结构体为 struct 类型。为该结构体定义两个字段,一个叫名字 (Name),一个叫年龄 (Age),分别是 string 类型和 int 类型。第一种方式在创建结构体变量时,直接指定字段的值,即var stu1 =Stu{"小明",19)//stu1---< var stu1 =Stu{"小明",19)//stu1---<

此时的顺序十分重要;另一种方式是利用类型推到,代码为:stu2 := stu{"小明~",20};如果担心值与字段顺序匹配不上,有些时候写完一段代码之后有可能会对代码进行更改,导致不小心调整了字段的顺序,那这样写就会比较危险,还有一种方式是在创建结构体变量时,把字段名和字段值写在一起(stu4 := stu{

Age : 30, Name : "mary",),这种写法不依赖字段的定义顺序,因此更加稳健。输入fmt.Print1n(stu1, stu2, stu3,stu4)完成调用,发现四个结构体变量的结构体的实例都是正确的。但是如果把 stu2中的20和小明~颠倒了,后果则会比较麻烦,这时相当于把20给了 Name,而把名字小明给了 Age,此时程序一定会报错。

核心代码:

package main

import (

"fmt"

)

type stu struct {

Name string

Age int

}

func main(){

//方式1:在 main 函数中完成

//在创建结构体变量时,就直接指定字段的值

var stu1 =Stu{"小明",19)//stu1--->结构体数据空间

stu2 := stu{"小明~",20}

//在创建结构体变量时,把字段名和字段值写在一起,这种写法就不依赖字段的定义顺序.

var stu3 = Stu{

Name : "jack",

Age : 20,

}

stu4 := stu{

Age : 30,

Name : "mary",

}

fmt.Print1n(stu1, stu2, stu3,stu4)

}

2.方式2

利用直接返回结构体的指针类型完成指定字段值,该方法的应用也是十分广泛的,后续学习工厂模式的时候会用到此处的知识点。有些时候我们希望把结构体的指针返回给一个变量,此时只需要在 Student 前面加上&即可。需要注意的是,方式1与方式2这两种方式是完全不一样的,方式1是直接把结构体返回一个变量,方式2是把一个结构体的指针返回一个变量,stu5 与 stu6 是指针类型,这与方式1所讲的内容不太一样,但是用法是一样的,这是因为golang的设计者将结构体和结构体指针的使用合并在一起了,会在编译器底层进行优化。方式2需要返回结构体的指针类型,比如 student2,调用时输入:var stu2= &stu("小王",29),此时的stu是指针类型的,而不是结构体类型.,因为此处引用了&。如果在内存里面可以想到 stu2 先指向了一个地址,这个地址又指向了结构体的数据空间,而数据库就是数据本身。stu6 可以利用类型推倒(stu6 := &stu{"小王~",39});另外在创建结构体指针变量的时候,把字段名和字段写在一起,这种写法也不会依赖于字段的定义顺序。

举例说明

此时有 var stu7 = &stu{Name :"小李",Age :49,}以及类型推到 stu8 := &stu{Age :59,Name :"小李~",},这两种方式都要注意添加逗号,输入fmt.Print1n(stu5,stu6,stu7,stu8)完成调用。输出的时候结果都会多一个&,可以通过取址符号*在输出的时候将&删掉,即输出调用时将代码更改为fmt.Print1n(*stu5,*stu6,*stu7,*stu8)

核心代码:

//方式2:返回结构体的指针类型(!!),并在 main 函数中完成

var stu5 = &stu{"小王",29}// stu5--〉地址---》结构体数据[xxxx ,xxx]

stu6 := &stu{"小王~",39}

//在创建结构体指针变量时,把字段名和字段值写在一起,这种写法就不依赖字段的定义顺序.

var stu7 = &stu{

Name :"小李",

Age :49,

}

stu8 := &stu{

Age :59,

Name :"小李~",

}

fmt.Print1n(*stu5,*stu6,*stu7,*stu8)

}

相关文章
|
3月前
不同类型(Type)的排序列表
不同类型(Type)的排序列表。
20 4
|
4月前
|
JavaScript 前端开发
ES6 中新增的两种数据类型及类型判断 ( 二 )
ES6 中新增的两种数据类型及类型判断 ( 二 )
|
4月前
|
存储 JavaScript 前端开发
ES6 中新增的两种数据类型及类型判断 ( 一 )
ES6 中新增的两种数据类型及类型判断 ( 一 )
|
5月前
|
前端开发
let array = [{id:‘001‘,name:‘小新‘,age:5},{ id:‘002‘,name:‘小葵‘]这样数据如何遍历,拿到其中一个值,数组中装对象如何获取其中一个固定的值
let array = [{id:‘001‘,name:‘小新‘,age:5},{ id:‘002‘,name:‘小葵‘]这样数据如何遍历,拿到其中一个值,数组中装对象如何获取其中一个固定的值
|
7月前
|
NoSQL C++
c++中包含string成员的结构体拷贝导致的double free问题
c++中包含string成员的结构体拷贝导致的double free问题
113 1
|
7月前
|
编译器 C语言 C++
【C++基础】 --- C++相对于C新增bool类型变量
【C++基础】 --- C++相对于C新增bool类型变量
45 1
|
7月前
|
程序员 C语言
用户自定义结构体类型
用户自定义结构体类型
62 0
|
7月前
结构体类型操作
自定义一个结构体类型的变量,其成员包括学号、姓名、年龄、性别,并将其类型声明为student,然后用该类型定义一个stu1的变量,进行赋值操作,并输出其值。
63 1
|
编译器 Serverless C++
8000字超详解自定义结构体类型
8000字超详解自定义结构体类型
147 0
8000字超详解自定义结构体类型