1. 程式人生 > 其它 >Go從入門到精通——結構體——為型別新增方法

Go從入門到精通——結構體——為型別新增方法

為型別新增方法

  Go 語言可以對任何型別新增方法。給一種型別新增方法就像給結構體新增方法一樣,因為結構體也是一種型別。

一、為基本型別新增方法

  在 Go 語言中,使用 type 關鍵字可以定義出新的自定義型別。之後就可以為自定義型別新增各種方法。我們習慣於使用面向過程的方式判斷一個值是否為0,例如:

if v == 0{
    // v 等於0
}

  如果將 v 當作整型物件,那麼判斷 v 值就可以增加一個 IsZero() 方法,通過這個方法就可以判斷 v 值是否為 0,例如:

if v.IsZero(){
    // v 等於0
}

  詳細程式碼參考如下:

package main

import "fmt"

//將 int 定義為 MyInt 型別
type MyInt int

func (m MyInt) IsZero() bool {
	return m == 0
}

func (m MyInt) Add(other int) int {
	return other + int(m)
}

func main() {

	var b MyInt
	fmt.Print(b.IsZero())

	b = 1
	fmt.Println("\n", b.Add(2))
}

二、http 包中的型別方法

  Go 語言提供的 http 包裡也大量使用了型別方法。Go 語言使用 http 包進行 HTTP 的請求,使用 http 包的 NewRequest()方法可以建立一個 HTTP 請求,填充請求中的 http 頭(req.Header),再呼叫 http.Client 的 Do 包方法,將傳入的 HTTP 請求傳送出去。

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
)

func main() {
	client := &http.Client{}

	//建立一個 HTTP 請求
	req, err := http.NewRequest("POST", "http://www.baidu.com", strings.NewReader("key=value"))

	//發現錯誤就列印並退出
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
		return
	}

	//為標頭新增資訊
	req.Header.Add("User-Agent", "my-client")

	//開始請求
	resp, err := client.Do(req)

	//處理請求的錯誤
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
		return
	}

	//讀取伺服器返回的內容
	data, err := ioutil.ReadAll(resp.Body)
	fmt.Println(string(data))

	defer resp.Body.Close()
}
 

三、time包中的型別方法

  Go 語言提供的 time 包主要用於是愛你的獲取和計算等。在這個包中,也使用了型別方法,例如:

package main

import (
    "fmt"
    "time"
)

func main(){
    fmt.Println(time.Second.String())
}