开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:创建结构体实例的四种方式】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9670
创建结构体实例的四种方式
内容介绍:
一、创建结构体变量和访问结构体字段方式1
二、创建结构体变量和访问结构体字段方式2
三、创建结构体变量和访问结构体字段方式3
四、创建结构体变量和访问结构体字段方式4
一、创建结构体变量和访问结构体字段的方式1
直接声明(前一节内容,不过多叙述)
案例演示:var person Person
该创建变量与访问结构体的形式在前几节的讲述中已进行了详细地讲述与举例,故不在此进行过多讲解。
二、创建结构体变量和访问结构体字段的方式2
利用{}(推荐使用)
案例演示:var person Person = Person{}
新建一个文件夹,命名为 structcreate(结构体的创建),在文件夹中先写一个文件—main.go,将这部分的共用代码:
package main
import (
"fmt”"
)
粘贴过来。现有一个定义为 person 的结构体,其字段有 name(String 类型)、age(int 类型)。可以输入 :
p2:=Person{}
,
此时值是默认的;若输入:
p2.Name = "tom"与p2.Age =18
,
输入fmt.Println(p2)
完成调用,此时运行效果显示为:
Name 为 tom、Age 为20岁。
根据赋值情况,程序会把值放到相应的字段里面并且在大括号里面直接给字段赋值,可以直接写入p2 := Person{"mary",20}
,由于第一个位置是字符串,可以输入marry( p2.Name = "tom")
进行赋值,而 age 则可直接写入18( p2.Age =18)
完成赋值。
核心代码:
p2:= Person{ "mary", 20}
// p2.Name = "tom"
// p2.Age =18
fmt.Println(p2)
三、创建结构体变量和访问结构体字段的方式3
利用&
案例:var person *Person = new (Person)
var p3*Person= new(Person)
的标准写法应该写作:
(*p3).Name ="smith"
,
其中(*p3).Name ="smith"
也可以这样写:
p3. Name = "smith"
,这是因为 go 的设计者为了程序员使用方便,会在编译底层对 p3,Name = "smith”
进行处理,
给 p3 加上取值运算:
(*p3).Name = "smith"
。
若进行重新赋值,最终的运行结果为新赋值的内容,因为新赋值的内容会将之前的内容覆盖
核心代码:
//案例:var person*Person = new (Person)
var p3*Person= new(Person)
//因为 p3 是一个指针,因此标准的给字段赋值方式是:(*p3).Name = "smith"
也可以这样写p3.Name = "smith"
,这是因为 go 的设计者为了程序员使用方便,底层会对p3.Name = "smith”
进行处理,会给 p3 加上取值运算,即(*p3).Name = "smith"
(*p3).Name = "smith"
p3。Name = "john”//
(*p3).Age = 30
p3.Age = 100
fmt.Print1n(*p3)
四、创建结构体变量和访问结构体字段的方式4
利用-{}
案例:var person *Person = &Person{}
因为 person 是一个指针,因此访问字段的标准方法是:
(*person) .Name = "scott"、(*person).Age = 88。
go的设计者为了程序员使用方便,也可以把(*person) .Name = "scott"、(*person).Age = 88
写成:
person.Name = "scott"和person.Age = 88
,底层会对 person.Name = "scott"和person.Age = 88
进行处理,加上:
(*person).Name = "scott"、(*person).Age = 88
的运算;
也可以直接给字段赋值,写作var person *Person = & Person{" mary".60}
核心代码:
//案例:var person *Person = &Person{}
//下面的语句,也可以直接给字符赋值
//var person *person = &Person{"mary" , 6o}
var person *person = &Person{}
//因为 person 是一个指针,因此标准的访问字段的方法为:(*person). Name = "scott”
,go 的设计者为了程序员使用方便,也可以 person.Name = "scott"
原因和上面一样,底层会对 person. Name = "scott”
进行处理,会加上(*person)
(*person).Name = "scott"
person. Name = "scott~~"
(*person).Age = 88
person.Age = 10
fmt.Print1n(*person)
说明:第3种和第4种方式返回的是结构体指针类型,而结构体指针类型访问字段的标准方式应该是:(*结构体指针).字段名,比如(*person).Name = "tom"
。但 go 语言做了一个简化,也支持结构体指针.字段名的访问形式,比如 person.Name = "tom",go编译器底层会对 person.Name 进行处理,将 person.Name 转化为(*person).Name,而这种简化后的访问形式更加符合程序员使用的习惯