日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别

發(fā)布時(shí)間:2025/1/21 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

入門示例

package main import "fmt" //定義老師結(jié)構(gòu)體,將老師中的各個(gè)屬性 統(tǒng)一放入結(jié)構(gòu)體中管理: type Teacher struct{//變量名字大寫外界可以訪問這個(gè)屬性Name stringAge intSchool string } func main(){//創(chuàng)建老師結(jié)構(gòu)體的實(shí)例、對(duì)象、變量:var t1 Teacher // var a intfmt.Println(t1) //在未賦值時(shí)默認(rèn)值:{ 0 }t1.Name = "xxx"t1.Age = 45t1.School = "清華大學(xué)"fmt.Println(t1)fmt.Println(t1.Age + 10) }

struct內(nèi)存分析

結(jié)構(gòu)體實(shí)例的創(chuàng)建方式

【1】方式1:直接創(chuàng)建:

【2】方式2:創(chuàng)建并賦值

【3】方式3:返回的是結(jié)構(gòu)體指針:

【4】方式4:返回的是結(jié)構(gòu)體指針:

結(jié)構(gòu)體之間的轉(zhuǎn)換

【1】結(jié)構(gòu)體是用戶單獨(dú)定義的類型,和其它類型進(jìn)行轉(zhuǎn)換時(shí)需要有完全相同的字段(名字、個(gè)數(shù)和類型)

package main import "fmt" type Student struct {Age int } type Person struct {Age int } func main(){var s Student = Student{10}var p Person = Person{10}s = Student(p)fmt.Println(s)fmt.Println(p) }

【2】結(jié)構(gòu)體進(jìn)行type重新定義(相當(dāng)于取別名),Golang認(rèn)為是新的數(shù)據(jù)類型,但是相互間可以強(qiáng)轉(zhuǎn)

package main import "fmt" type Student struct {Age int } type Stu Student func main(){var s1 Student = Student{19}var s2 Stu = Stu{19}s1 = Student(s2)fmt.Println(s1)fmt.Println(s2) }

方法的引入

【1】方法是作用在指定的數(shù)據(jù)類型上、和指定的數(shù)據(jù)類型綁定,因此自定義類型,都可以有方法,而不僅僅是struct
【2】方法的聲明和調(diào)用格式:

聲明: type A struct {Num int } func (a A) test() {fmt.Println(a.Num) }調(diào)用: var a A a.test()

(1)func (a A) test()相當(dāng)于A結(jié)構(gòu)體有一個(gè)方法叫test
(2)(a A)體現(xiàn)方法test和結(jié)構(gòu)體A綁定關(guān)系

【3】代碼層面:

注意: (1)test方法中參數(shù)名字隨意起 (2)結(jié)構(gòu)體Person和test方法綁定,調(diào)用test方法必須靠指定的類型:Person (3)如果其他類型變量調(diào)用test方法一定會(huì)報(bào)錯(cuò)。 (4)結(jié)構(gòu)體對(duì)象傳入test方法中,值傳遞,和函數(shù)參數(shù)傳遞一致。

方法的注意事項(xiàng)

(1)結(jié)構(gòu)體類型是值類型,在方法調(diào)用中,遵守值類型的傳遞機(jī)制,是值拷貝傳遞方式

(2)如程序員希望在方法中,改變結(jié)構(gòu)體變量的值,可以通過結(jié)構(gòu)體指針的方式來處理

我們寫程序的時(shí)候,可以直接簡化:

底層編譯器做了優(yōu)化,底層會(huì)自動(dòng)幫我們加上 & *

(3)Golang中的方法作用在指定的數(shù)據(jù)類型上的,和指定的數(shù)據(jù)類型綁定,因此自定義類型,都可以有方法,而不僅僅是struct,比如int , float32等都可以有方法

package main import "fmt" type integer int func (i integer) print(){i = 30fmt.Println("i = ",i) } func (i *integer) change(){*i = 30fmt.Println("i = ",*i) } func main(){var i integer = 20i.print()i.change()fmt.Println(i) }

(4)方法的訪問范圍控制的規(guī)則,和函數(shù)一樣。方法名首字母小寫,只能在本包訪問,方法首字母大寫,可以在本包和其它包訪問。

(5)如果一個(gè)類型實(shí)現(xiàn)了String()這個(gè)方法,那么fmt.Println默認(rèn)會(huì)調(diào)用這個(gè)變量的String()進(jìn)行輸出

以后定義結(jié)構(gòu)體的話,常定義String()作為輸出結(jié)構(gòu)體信息的方法,在fmt.Println會(huì)自動(dòng)調(diào)用

package main import "fmt" type Student struct{Name stringAge int } func (s *Student) String() string{str := fmt.Sprintf("Name = %v , Age = %v",s.Name,s.Age)return str } func main(){stu := Student{Name : "麗麗",Age : 20,}//傳入地址,如果綁定了String方法就會(huì)自動(dòng)調(diào)用fmt.Println(&stu) }

方法與函數(shù)的區(qū)別

【1】綁定指定類型:
方法:需要綁定指定數(shù)據(jù)類型
函數(shù):不需要綁定數(shù)據(jù)類型

【2】調(diào)用方式不一樣:
函數(shù)的調(diào)用方式:
函數(shù)名(實(shí)參列表)
方法的調(diào)用方式:變量.方法名(實(shí)參列表)

package main import "fmt" type Student struct{Name string } //定義方法: func (s Student) test01(){fmt.Println(s.Name) } //定義函數(shù): func method01(s Student){fmt.Println(s.Name) } func main(){//調(diào)用函數(shù):var s Student = Student{"麗麗"}method01(s)//方法調(diào)用:s.test01() }

【3】對(duì)于函數(shù)來說,參數(shù)類型對(duì)應(yīng)是什么就要傳入什么。

package main import "fmt" type Student struct{Name string } //定義函數(shù): func method01(s Student){fmt.Println(s.Name) } func method02(s *Student){fmt.Println((*s).Name) } func main(){var s Student = Student{"麗麗"}method01(s)//method01(&s)錯(cuò)誤method02(&s)//method02(s)錯(cuò)誤 }

【4】對(duì)于方法來說,接收者為值類型,可以傳入指針類型,接受者為指針類型,可以傳入值類型。

package main import "fmt" type Student struct{Name string } //定義方法: func (s Student) test01(){fmt.Println(s.Name) } func (s *Student) test02(){fmt.Println((*s).Name) } func main(){var s Student = Student{"麗麗"}s.test01()(&s).test01()//雖然用指針類型調(diào)用,但是傳遞還是按照值傳遞的形式(&s).test02()s.test02()//等價(jià) }

總結(jié)

以上是生活随笔為你收集整理的go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。