go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别
入門示例
package main import "fmt" //定義老師結構體,將老師中的各個屬性 統一放入結構體中管理: type Teacher struct{//變量名字大寫外界可以訪問這個屬性Name stringAge intSchool string } func main(){//創建老師結構體的實例、對象、變量:var t1 Teacher // var a intfmt.Println(t1) //在未賦值時默認值:{ 0 }t1.Name = "xxx"t1.Age = 45t1.School = "清華大學"fmt.Println(t1)fmt.Println(t1.Age + 10) }struct內存分析
結構體實例的創建方式
【1】方式1:直接創建:
【2】方式2:創建并賦值
【3】方式3:返回的是結構體指針:
【4】方式4:返回的是結構體指針:
結構體之間的轉換
【1】結構體是用戶單獨定義的類型,和其它類型進行轉換時需要有完全相同的字段(名字、個數和類型)
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】結構體進行type重新定義(相當于取別名),Golang認為是新的數據類型,但是相互間可以強轉
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】方法是作用在指定的數據類型上、和指定的數據類型綁定,因此自定義類型,都可以有方法,而不僅僅是struct
【2】方法的聲明和調用格式:
(1)func (a A) test()相當于A結構體有一個方法叫test
(2)(a A)體現方法test和結構體A綁定關系
【3】代碼層面:
方法的注意事項
(1)結構體類型是值類型,在方法調用中,遵守值類型的傳遞機制,是值拷貝傳遞方式
(2)如程序員希望在方法中,改變結構體變量的值,可以通過結構體指針的方式來處理
我們寫程序的時候,可以直接簡化:
底層編譯器做了優化,底層會自動幫我們加上 & *
(3)Golang中的方法作用在指定的數據類型上的,和指定的數據類型綁定,因此自定義類型,都可以有方法,而不僅僅是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)方法的訪問范圍控制的規則,和函數一樣。方法名首字母小寫,只能在本包訪問,方法首字母大寫,可以在本包和其它包訪問。
(5)如果一個類型實現了String()這個方法,那么fmt.Println默認會調用這個變量的String()進行輸出
以后定義結構體的話,常定義String()作為輸出結構體信息的方法,在fmt.Println會自動調用
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方法就會自動調用fmt.Println(&stu) }方法與函數的區別
【1】綁定指定類型:
方法:需要綁定指定數據類型
函數:不需要綁定數據類型
【2】調用方式不一樣:
函數的調用方式:
函數名(實參列表)
方法的調用方式:變量.方法名(實參列表)
【3】對于函數來說,參數類型對應是什么就要傳入什么。
package main import "fmt" type Student struct{Name string } //定義函數: 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)錯誤method02(&s)//method02(s)錯誤 }【4】對于方法來說,接收者為值類型,可以傳入指針類型,接受者為指針類型,可以傳入值類型。
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()//雖然用指針類型調用,但是傳遞還是按照值傳遞的形式(&s).test02()s.test02()//等價 }總結
以上是生活随笔為你收集整理的go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go map(映射)的概念、3种创建方式
- 下一篇: go slice切片详解:定义、遍历、追