Go語言方法
概念
Go語言中的方法就是一個(gè)特殊的函數(shù), 這個(gè)函數(shù)和某種數(shù)據(jù)綁定在一起,就稱之為方法
一般都是和結(jié)構(gòu)體之間綁定
- 方法格式
func(接受者名稱 接受者類型)函數(shù)名稱(形參列表)(返回值列表){
執(zhí)行語句
}
- 第一種
package main
import "fmt"
//定義了一個(gè)Person的結(jié)構(gòu)體
type Person struct{
name string
age int
}
//定義了一個(gè)say方法和 Person 綁定在一起
func(Person)say(){
fmt.Println("hello world")
}
func main() {
}
- 第二種 指定接收者名稱
package main
import "fmt"
//定義了一個(gè)Person的結(jié)構(gòu)體
type Person struct{
name string
team string
}
//定義了一個(gè)say方法和 Person 綁定在一起
func(p Person)say(){
fmt.Println(p.name,p.team)
}
func main() {
var people Person = Person{"范佩西","費(fèi)耶諾德"}
people.say() // 方法只能通過綁定數(shù)據(jù)類型對應(yīng)的變量來調(diào)用
}
- 方法只能通過綁定數(shù)據(jù)類型對應(yīng)的變量來調(diào)用
- 如果指定接受者名稱 , 調(diào)用的方法的時(shí)候會(huì)將調(diào)用者傳給接收者
- 可以理解 接收者 看作函數(shù)的一個(gè)參數(shù)

微信圖片_20180927170805.png
既然作為參數(shù)傳遞就涉及到地址傳遞 值傳遞
- 值傳遞
package main
import "fmt"
//定義了一個(gè)Person的結(jié)構(gòu)體
type Person struct{
name string
team string
}
//定義普通方法
func (p Person)setName(name string){
p.name = name
}
func main() {
var people Person = Person{"范佩西","費(fèi)耶諾德"}
people.setName("亨利")
fmt.Println(people) //打印 {范佩西 費(fèi)耶諾德}
}
- 地址傳遞
package main
import "fmt"
//定義了一個(gè)Person的結(jié)構(gòu)體
type Person struct{
name string
team string
}
//定義指針類型的接收者的方法
func (p *Person)setTeam(team string){
(*p).team = team
}
func main() {
var people Person = Person{"范佩西","費(fèi)耶諾德"}
p := &people
p.setTeam("阿森納")
fmt.Println(people) //打印 {范佩西 阿森納}
}
函數(shù)和方法比較
1. 方法和函數(shù)都是 函數(shù)類型 所以也可以定義變量保存方法
package main
import "fmt"
//定義了一個(gè)Person的結(jié)構(gòu)體
type Person struct{
name string
team string
}
//定義的方法
func (p Person)sayTeam(){
fmt.Println(p.team)
}
func main() {
var people Person = Person{"范佩西","費(fèi)耶諾德"}
var fn func ()
fn = people.sayTeam
fn() // 費(fèi)耶諾德
}
2. 函數(shù)通過 包名.函數(shù)名稱() 調(diào)用 方法通過 變量.方法名稱() 調(diào)用
3. 函數(shù)名稱和方法名稱可以相同 因?yàn)楹瘮?shù)是獨(dú)立的
4. 接收者可以看作是方法的一個(gè)參數(shù),這個(gè)參數(shù)區(qū)分 值傳遞和地址傳遞
5. 接收者地址傳遞的兩種方法
(*指針變量名).方法名( )
普通變量名.方法名( )
- 只要接受者是指針類型,那么編譯器就會(huì)自動(dòng)把
普通變量的地址取出來給 接收者
package main
import "fmt"
//定義了一個(gè)Person的結(jié)構(gòu)體
type Person struct{
name string
team string
}
//定義指針類型的接收者的方法
func (p *Person)setTeam(team string){
(*p).team = team
}
func main() {
var people Person = Person{"范佩西","費(fèi)耶諾德"}
people.setTeam("阿森納") // &people . setTeam()
fmt.Println(people) //打印 {范佩西 阿森納}
}
Go語言的接口
概念
- GO語言的接口就是用于定義某種規(guī)范, 只要使用者按照接口定義的規(guī)范就可以使用
接口的作用
- 在Go語言中接口專門用于定義函數(shù)的聲明
- 從而規(guī)定函數(shù)的名稱 ,函數(shù)的形參 ,函數(shù)的返回值
接口的定義格式
type 接口名稱 interface{
方法名()
}
- 注意點(diǎn)
- 接口是虛的,只能有方法的聲明,沒有方法的實(shí)現(xiàn)
- 接口中聲明的方法,只能通過和某種該數(shù)據(jù)綁定的方法來實(shí)現(xiàn),不能通過函數(shù)的格式實(shí)現(xiàn)
- 在GO語言中,只要某個(gè)數(shù)據(jù)類型實(shí)現(xiàn)了接口中聲明的
所有方法,那么就代表這個(gè)數(shù)據(jù)類型實(shí)現(xiàn)了這個(gè)接口 - 只要一個(gè)數(shù)據(jù)類型實(shí)現(xiàn)了某個(gè)接口, 那么就可以使用這個(gè)接口類型的變量來保存這個(gè)類型的數(shù)據(jù)
- 同樣的只要一個(gè)數(shù)據(jù)類型實(shí)現(xiàn)了某個(gè)接口, 那么保存這個(gè)類型之后, 就可以使用接口類型變量調(diào)用接口中的方法
- 案例
package main
import "fmt"
//定義一個(gè)接口 interface == 接口
type intface interface{
//定義方法格式
start(name string)
end(name string)
}
//定義一個(gè)結(jié)構(gòu)體
type Phone struct {
}
//定義start方法
func (Phone)start(name string){
fmt.Println(name,"啟動(dòng)了")
}
//定義end方法
func (Phone)end(name string){
fmt.Println(name,"關(guān)閉了")
}
func main() {
//定義一個(gè)實(shí)現(xiàn)接口數(shù)據(jù)類型的變量
var ph Phone = Phone{}
//頂一個(gè)接口類型的變量
var in intface
in = ph
in.start("Oppo") // Oppo 啟動(dòng)了
in.end("Oppo") // Oppo 關(guān)閉了
}
- 圖片簡解

微信圖片_20180927181737.png
- 其他注意點(diǎn)
- 接口中只能有方法的聲明 不能有變量的聲明
- 只有實(shí)現(xiàn)了接口中聲明的所有方法,才算實(shí)現(xiàn)了接口,才能使用接口變量保存
- 在實(shí)現(xiàn)接口的時(shí)候,方法名稱,形參列表,返回值列表必須一樣
- 接口和結(jié)構(gòu)體一樣可以嵌套
- 接口和結(jié)構(gòu)體一樣,嵌套時(shí)不能嵌套自己
- 可以將超集接口變量賦值給子集接口變量, 不可以將子集接口變量賦值給超集接口變量
- 任何情況接口中不能出現(xiàn)同名的方法聲明
空接口
- Go語言的空接口可以充當(dāng)任何類型的數(shù)據(jù)
- 空接口格式
interface{ }
- 定義空接口
var value interface{}
value = 1
注意點(diǎn)
- 空接口類型可以讓數(shù)組和切片保存不同數(shù)據(jù)類型的數(shù)據(jù)
package main
import "fmt"
func main() {
var arr[3]interface{}
arr[0] = "亨利"
arr[1] = 32
arr[2] = false
fmt.Println(arr) // [亨利 32 false]
}