Go言语之筹划体与编制
1 、言语筹划体
筹划体是划体一系列属性的集结(近似于 Python 中的类)
1、筹划体的编制定义与独霸
// 定义type Person struct { Name string Age int Sex string}func main() { // 独霸 var per Person per.Name="XiaoYang" fmt.Println(per)}2、定义并赋初值
type Person struct { Name string Age int Sex string}func main() { var per1 Person = Person{ Name: "XiaoYang"} // 按关头字传参,言语可以少传 var per2 Person = Person{ "Bob",划体 20, "男"} // 按职位传参,全传 fmt.Println(per1) // 输进:{ XiaoYang 0 } fmt.Println(per2) // 输进:{ Bob 20 男}}3、编制匿名筹划体(只独霸一次 ,言语没驰名字)
// 定义个匿名筹划体并实例化此后赋值给了 hobby 变量hobby := struct { HobbyId int HobbyName string}{ HobbyId: 1,划体 HobbyName: "篮球"}fmt.Println(hobby) // 输进 :{ 1 篮球}fmt.Println(hobby.HobbyName) // 输进:篮球4、筹划体的编制零值
定义好的筹划体没有被初始化时,该筹划体的言语字段将默许赋值为零值
也就是我属性的零值,所以他是划体值圭表类型,参数传递 ,编制copy 传递 ,言语在函数中改削不会影响本来的划体
type Person struct { Name string Age int Sex string}func main() { var per Person=Person{ "Bob", 20, "男"} fmt.Println(per) // 输进:{ Bob 20 男} test(per) // 输进
:{ Bob 20 男} fmt.Println(per) // 输进:{ Bob 20 男}}func test(per Person) { per.Age=20 fmt.Println(per)}5 、筹划体的编制指针
// & 放在变量前,展示取该变量的地址// * 放在圭表类型前,展示指向该圭表类型的指针(变量定义,指定圭表类型时才会用到) *[3]int 和 [3]*int// * 放在变量前,展示解援引(掏出指针指向的具体的值)type Person struct { Name string Age int Sex string}func main() { var per1 *Person fmt.Println(per1) // 输进:<nil> 展示指针圭表类型 // 定义并初始化 var per2 *Person = &Person{ } fmt.Println(per2) // 输进
:&{ 0 } // 把per2的名字改成XiaoYang (*per2).Name = "XiaoYang" // 也支撑直接独霸 per2.Name = "Bob" fmt.Println(per2) // 输进 :&{ Bob 0 }}6 、匿名字段(字段没驰名字,只需圭表类型)
可用于【变量汲引 / 汲引字段】近似于面向对象的延续
// 定义一个筹划体,匿名字段圭表类型就是字段名字
,全数圭表类型不克不及几回type Person struct { string int Sex string}func main() { per := Person{ "XiaoYang", 20, "男"} // 字段匿名,圭表类型就是字段名 fmt.Println(per) // 输进:{ XiaoYang 20 男} fmt.Println(per.string) // 输进
:XiaoYang}7 、嵌套筹划体(筹划体中套筹划体)
type Person struct { Name string Age int Sex string Hobby Hobby // Person中嵌套Hobby筹划体字段}type Hobby struct { HobbyId int HobbyName string}func main() { per := Person{ Name:"XiaoYang", Age: 20, Sex: "男", Hobby: Hobby{ 1,"篮球"}} fmt.Println(per) // 输进:{ XiaoYang 20 男 { 1 篮球}} fmt.Println(per.Name) // 输进:XiaoYang fmt.Println(per.Hobby.HobbyName) // 输进 :篮球}8、字段汲引
筹划体中有匿名的筹划体圭表类型字段,则该匿名筹划体里的字段就称为汲引字段 ,可以从内部直接访谒
type Person struct { Name string Age int Sex string Hobby // Person中嵌套Hobby匿名筹划体字段}type Hobby struct { HobbyId int HobbyName string}func main() { per := Person{ Name:"XiaoYang", Age: 20, Sex: "男", Hobby: Hobby{ 1,"篮球"}} // 打印欢欣乐乐喜悦爱好的名字(Hobby是一个匿名字段
,会字段汲引) fmt.Println(per.HobbyName) // 输进:篮球 // per.hobby 近似于面向对象中的super() fmt.Println(per.Hobby.HobbyName) // 输进:篮球}// ------------------------------------------------------------------------------------// 当子类和父类中的字段名一样时
,就像面向对象的延续,子类延续父类(筹划体嵌套
,匿名字段) ,子类可以直接调用父类中的属性或编制type Person struct { Name string Age int Sex string Hobby // Person中嵌套Hobby匿名字段}type Hobby struct { HobbyId int Name string}func main() { per := Person{ Name:"XiaoYang", Age: 20, Sex: "男", Hobby: Hobby{ 1,"篮球"}} fmt.Println(per.Name) // 输进:XiaoYang ——>优先独霸本身的 fmt.Println(per.Hobby.Name) // 输进:篮球 ——>指定打印Hobby的名字}9、筹划体相当性
筹划体是值圭表类型 。
假定它的每个字段都是可斗劲的,则该筹划体也是可以斗劲的 。
假定两个筹划体变量的对应字段相当,则两个变量也是相当的 。
假定筹划体包含不成斗劲的字段 ,则筹划体变量也不成斗劲。
type Person struct { Name string Age int Sex string // 包含不成斗劲的字段 Test []int ——>这是援引圭表类型不成斗劲}func main() { // 值圭表类型可以直接==斗劲
,援引圭表类型只能跟nil用==斗劲 per1 := Person{ Name: "XiaoYang"} per2 := Person{ Name: "XiaoYang"} per3 := Person{ Name: "XiaoYang", Age: 20} fmt.Println(per1 == per2) // 输进:ture ——>包含不成斗劲圭表类型都邑直接报错 fmt.Println(per1 == per3) // 输进:false}2、编制
编制就是一个出格函数 ,在函数的根本上加了一些对象
在func这个关头字和编制名中心介入一个出格的领受器圭表类型,领受器可所以筹划体圭表类型 ,也可以黑色筹划体圭表类型
1、编制的定义和独霸
type Person struct { Name string Age int Sex string}// 定义逐浅近例:给Person筹划体绑定逐浅近例 ,oneself(名字尽情取)近似于Python类中的selffunc (oneself Person) printName() { // 在编制内独霸oneself fmt.Println(oneself.Name)}func main() { // 独霸
,对象调用编制 per := Person{ } per.Name = "XiaoYang" // 绑定给对象的编制 per.printName() // 输进 :XiaoYang}2、有了函数为啥还需求编制 ?
编制下场都能完成 ,可是呢 ?它就可以指定给某个对象了 。
type Person struct { Name string Age int Sex string}// 编制func (oneself Person) printName() { fmt.Println(oneself.Name)}// 函数func printName(oneself Person) { fmt.Println(oneself.Name)}func main() { per := Person{ Name: "XiaoYang"} per.printName() // 编制的出格的中心,可以主动传递值 printName(per) // 函数需求手动传递值}3 、指针领受器与值领受器
type Person struct { Name string Age int Sex string}// 值领受器改削名字func (oneself Person) changeName(name string) { oneself.Name = name}// 指针领受器改削岁数func (oneself *Person) changeAge(age int) { oneself.Age = age}func main() { per := Person{ Name: "XiaoYang", Age: 20} fmt.Println(per) // 输进:{ XiaoYang 20 } per.changeName("Bob")// 因为这个是值领受器,它是copy一份传递畴昔所以改削的是copy的不会改损掉落踪落本来的 per.changeAge(18) // 指针领受器,它传递的是指针 fmt.Println(per) // 输进
:{ XiaoYang 18 }}/*甚么时辰用指针领受器
,甚么时辰独霸值领受器
: -想改本来的 ,就用指针 -不想改本来的 ,就用值*/5 、匿名字段的编制(编制汲引)
type Person struct { Name string Age int Sex string Hobby // 匿名字段}type Hobby struct { Id int Name string}// 打印Person的名字func (oneself Person) printName() { fmt.Println(oneself.Name)}// 打印Hobby的名字func (oneself Hobby) printHobbyName() { fmt.Println(oneself.Name)}// 打印Hobby的名字func (oneself Hobby) printName() { fmt.Println(oneself.Name)}func main() { per := Person{ Name: "XiaoYang", Hobby: Hobby{ 1, "篮球"}} per.printName() // 输进:XiaoYang per.printHobbyName() // 输进 :篮球 // 假定编制重名了,优先独霸筹划体本身的 per.printName() // 输进:XiaoYang per.Hobby.printName() // 输进 :篮球}6 、在编制中独霸值领受器 与 在函数中独霸值参数
type Person struct { Name string Age int Sex string}// 在编制中独霸值领受器func (oneself Person) printName() { fmt.Println(oneself.Name)}// 在函数中独霸值参数func printName(oneself Person) { fmt.Println(oneself.Name)}func main() { per1 := &Person{ Name: "XiaoYang"} // per1是个指针 per2 := Person{ Name: "Bob"} printName(*per1) // 输进:XiaoYang per1.printName() // 输进
:XiaoYang ———> 值收器:可以用值来调,也可以用指针来调 per2.printName() // 输进:Bob}7 、在编制中独霸指针领受器 与 在函数中独霸指针参数
type Person struct { Name string Age int Sex string}// 在编制中独霸指针领受器func (oneself *Person) printName() { fmt.Println(oneself.Name)}func (oneself *Person)changeName(name string) { oneself.Name=name}// 在函数中独霸指针参数func printName(oneself *Person) { fmt.Println(oneself.Name)}func main() { per1 := Person{ Name: "XiaoYang"} per2 := &Person{ Name: "Bob"} // per1是个指针 per1.printName() // 值可以调用 printName(&per1) per2.printName() // 指针可以调用 printName(per2) per1.changeName("Alen") // 可以改削 fmt.Println(per1) per2.changeName("YS") // 可以改削 fmt.Println(per2)}总结:
- -非论是值圭表类型领受器仍是指针圭表类型领受器 ,都可以用值来调用,或指针来调用 。
- -非论是值仍是指针来调用
,只假定值圭表类型领受器,改的就是新的 ,只假定指针圭表类型领受器,改的是本来的。
8 、非筹划体上绑定编制
禁尽予在根本数据圭表类型上绑定编制(如 :int、string ... )
可是本身定义的圭表类型可以绑定编制
type Myint intfunc (i *Myint) add() { (*i)++}func main() { var a Myint = 10 fmt.Println(a) // 输进:10 a.add() a.add() a.add() fmt.Println(a) // 输进 :13}到此这篇关于Go言措辞语之筹划体与编制的文章就引见到这了,更多相干Go言语之筹划体内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !


