Go語言方法
概念
Go語言中的方法就是一個特殊的函數, 這個函數和某種數據綁定在一起,就稱之為方法
一般都是和結構體之間綁定
- 方法格式
func(接受者名稱 接受者類型)函數名稱(形參列表)(返回值列表){
執行語句
}
- 第一種
package main
import "fmt"
//定義了一個Person的結構體
type Person struct{
name string
age int
}
//定義了一個say方法和 Person 綁定在一起
func(Person)say(){
fmt.Println("hello world")
}
func main() {
}
- 第二種 指定接收者名稱
package main
import "fmt"
//定義了一個Person的結構體
type Person struct{
name string
team string
}
//定義了一個say方法和 Person 綁定在一起
func(p Person)say(){
fmt.Println(p.name,p.team)
}
func main() {
var people Person = Person{"范佩西","費耶諾德"}
people.say() // 方法只能通過綁定數據類型對應的變量來調用
}
- 方法只能通過綁定數據類型對應的變量來調用
- 如果指定接受者名稱 , 調用的方法的時候會將調用者傳給接收者
- 可以理解 接收者 看作函數的一個參數
微信圖片_20180927170805.png
既然作為參數傳遞就涉及到地址傳遞 值傳遞
- 值傳遞
package main
import "fmt"
//定義了一個Person的結構體
type Person struct{
name string
team string
}
//定義普通方法
func (p Person)setName(name string){
p.name = name
}
func main() {
var people Person = Person{"范佩西","費耶諾德"}
people.setName("亨利")
fmt.Println(people) //打印 {范佩西 費耶諾德}
}
- 地址傳遞
package main
import "fmt"
//定義了一個Person的結構體
type Person struct{
name string
team string
}
//定義指針類型的接收者的方法
func (p *Person)setTeam(team string){
(*p).team = team
}
func main() {
var people Person = Person{"范佩西","費耶諾德"}
p := &people
p.setTeam("阿森納")
fmt.Println(people) //打印 {范佩西 阿森納}
}
函數和方法比較
1. 方法和函數都是 函數類型 所以也可以定義變量保存方法
package main
import "fmt"
//定義了一個Person的結構體
type Person struct{
name string
team string
}
//定義的方法
func (p Person)sayTeam(){
fmt.Println(p.team)
}
func main() {
var people Person = Person{"范佩西","費耶諾德"}
var fn func ()
fn = people.sayTeam
fn() // 費耶諾德
}
2. 函數通過 包名.函數名稱() 調用 方法通過 變量.方法名稱() 調用
3. 函數名稱和方法名稱可以相同 因為函數是獨立的
4. 接收者可以看作是方法的一個參數,這個參數區分 值傳遞和地址傳遞
5. 接收者地址傳遞的兩種方法
(*指針變量名).方法名( )
普通變量名.方法名( )
- 只要接受者是指針類型,那么編譯器就會自動把
普通變量
的地址
取出來給 接收者
package main
import "fmt"
//定義了一個Person的結構體
type Person struct{
name string
team string
}
//定義指針類型的接收者的方法
func (p *Person)setTeam(team string){
(*p).team = team
}
func main() {
var people Person = Person{"范佩西","費耶諾德"}
people.setTeam("阿森納") // &people . setTeam()
fmt.Println(people) //打印 {范佩西 阿森納}
}
Go語言的接口
概念
- GO語言的接口就是用于定義某種規范, 只要使用者按照接口定義的規范就可以使用
接口的作用
- 在Go語言中接口專門用于定義函數的聲明
- 從而規定函數的名稱 ,函數的形參 ,函數的返回值
接口的定義格式
type 接口名稱 interface{
方法名()
}
- 注意點
- 接口是虛的,只能有方法的聲明,沒有方法的實現
- 接口中聲明的方法,只能通過和某種該數據綁定的方法來實現,不能通過函數的格式實現
- 在GO語言中,只要某個數據類型實現了接口中聲明的
所有
方法,那么就代表這個數據類型實現了這個接口 - 只要一個數據類型實現了某個接口, 那么就可以使用這個接口類型的變量來保存這個類型的數據
- 同樣的只要一個數據類型實現了某個接口, 那么保存這個類型之后, 就可以使用接口類型變量調用接口中的方法
- 案例
package main
import "fmt"
//定義一個接口 interface == 接口
type intface interface{
//定義方法格式
start(name string)
end(name string)
}
//定義一個結構體
type Phone struct {
}
//定義start方法
func (Phone)start(name string){
fmt.Println(name,"啟動了")
}
//定義end方法
func (Phone)end(name string){
fmt.Println(name,"關閉了")
}
func main() {
//定義一個實現接口數據類型的變量
var ph Phone = Phone{}
//頂一個接口類型的變量
var in intface
in = ph
in.start("Oppo") // Oppo 啟動了
in.end("Oppo") // Oppo 關閉了
}
- 圖片簡解
微信圖片_20180927181737.png
- 其他注意點
- 接口中只能有方法的聲明 不能有變量的聲明
- 只有實現了接口中聲明的所有方法,才算實現了接口,才能使用接口變量保存
- 在實現接口的時候,方法名稱,形參列表,返回值列表必須一樣
- 接口和結構體一樣可以嵌套
- 接口和結構體一樣,嵌套時不能嵌套自己
- 可以將超集接口變量賦值給子集接口變量, 不可以將子集接口變量賦值給超集接口變量
- 任何情況接口中不能出現同名的方法聲明
空接口
- Go語言的空接口可以充當任何類型的數據
- 空接口格式
interface{ }
- 定義空接口
var value interface{}
value = 1
注意點
- 空接口類型可以讓數組和切片保存不同數據類型的數據
package main
import "fmt"
func main() {
var arr[3]interface{}
arr[0] = "亨利"
arr[1] = 32
arr[2] = false
fmt.Println(arr) // [亨利 32 false]
}