开发者学堂课程【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)
}