Go基礎知識梳理(三)
結構
type Person struct {
name string
sex int
}
func main() {
//推薦寫法
person := Person{
name: "張三",
sex: 1,
}
//不推薦寫法
person = Person{"李四", 1}
p := New(Person)
//會初始化name="", sex = 0
}
介面
//介面的一些特點:
//介面的命名一般以er結尾,具體看業務場景
//介面內部的方法不需要func引導
//在介面的定義中沒有實作只有宣告
type Person inteface{
Say()
Run()
}
//具有Person中的方法,則視為該介面的實作類
type Man struct{}
func (m Man) Say(){}
func (m Man) Run(){}
type Woman struct{}
func (m Woman) Say(){}
func (m Woman) Run(){}
方法
//首先看一段代碼
type Person struct {
Age int
}
func (p Person) Age() {
fmt.Println(p.Age)
}
func (p *Person) Age2() {
fmt.Println(p.Age)
}
//發現兩個Age方法,一個接受的是值型別,一個接受的指標,那么區別在哪里呢?
//這兩個方法實際等于
func Age(p Person) {
fmt.Println(p.Age)
}
func Age2(p *Person) {
fmt.Println(p.Age)
}
//也就是說相當于引數來進行傳值
//傳值型別也就是值的拷貝(資料的副本),在函式內改變其數值不會影響到原來的值
//傳入的數值型別為指標,就是相當于傳入該資料的記憶體地址,在函式內改變其數值會影響全域
//高級用法
//src/net/http/server.go
type HandlerFunc func(ResponseWriter, *Request)
//這是一種包裝器的編程技法,為函式添加方法
func (f HandlerFunc) ServeHttp(w ResponseWriter, r *Request) {
f(w, r)
}
//同時HandlerFunc實作了Handler介面
type Handler interface{
ServeHttp(ResponseWriter, *Request)
}
func (mux *ServeMux) Handle(pattern string, handler Handler)
//handler方法轉為HandlerFunc函式,同時因為HandlerFunc實作了Handler介面,所以可以運用mux的Handle方法
func (mux *ServeMux) HandlerFunc(pattern string, handler func(ResponseWriter, *Request)) {
mux.Handle(pattern, HandlerFunc(handler))
}
通過 http 標準庫里面對于函式型別的使用,我們可以看到函式型別的如下意義
( 1 )函式也是一種型別,可以在函式字面量型別的基礎上定義一種命名函式型別,
(2 )有名函式和匿名函式的函式簽名與命名函式型別的底層型別相同,它們之間可以進行型別轉換,
(3 )可以為有名函式型別添加方法,這種為一個函式型別添加方法的技法非常有價值,可以方便地為一個函式增加“攔截”或“過濾”等額外功能,這提供了一種裝飾設計模式
(4 )為有名函式型別添加方法,使其與介面打通關系,使用介面的地方可以傳遞函式型別的變數,這為函式到介面的轉換開啟了大門
型別斷言
//推薦寫法
var i interface{}
i = 1
var a int
if _, ok := i.(int); !ok {
//err處理
return
}
a = i.(int)
fmt.Println(a)
//或者
var i interface{}
i = 1
if a, ok := i.(int); ok {
fmt.Println(a)
return
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/423228.html
標籤:Go
下一篇:豐富Bean的配置
