GO语言实战之函数与方法
寫在前面
- 嗯,學習GO,所以有了這篇文章
- 博文內(nèi)容為《GO語言實戰(zhàn)》讀書筆記之一
- 主要涉及知識
- GO函數(shù)及其他語言對比
- GO用戶定義類型(結(jié)構(gòu)體)
- Go方法
傍晚時分,你坐在屋檐下,看著天慢慢地黑下去,心里寂寞而凄涼,感到自己的生命被剝奪了。當時我是個年輕人,但我害怕這樣生活下去,衰老下去。在我看來,這是比死亡更可怕的事。--------王小波
函數(shù)
對于這個概念小伙伴一定不陌生,常用的腳本語言中一般都會用,通過函數(shù)來整合一些邏輯上耦合性較強的代碼塊,從而提高代碼的可讀性,可復用性。
GO語言中的函數(shù)語法格式和其他語言略有不同,函數(shù)可以先使用后定義,同時go支持閉包,拆包,異常信息返回等
語法格式
func funcName(param paramType)(returnVal1 returnType, err error){// do something }demo
package mainimport ("fmt""time" )func main() {nowTime := time.Now()fmt.Println(nowTime.Format("2006-01-02 15:04:05"))// 拆包i, j := func_demo()//調(diào)用有參函數(shù)func_demos("你好,世界!")fmt.Println(i, j)// 匿名函數(shù)get_func_demo := func(x int) int {return x}fmt.Println(get_func_demo(3))// 閉包f := get_func_()fmt.Println(f()) } // 拆包 func func_demo() (int, int) {fmt.Println("你好,世界!")return 1, 2 } // 接收參數(shù) func func_demos(mes string) {fmt.Println(mes) } // 閉包 func get_func_() (func() int){i := 1return func() (int) {i+=1return i} } ============ 2022-04-14 10:01:03 你好,世界! 你好,世界! 1 2 3 2其他的腳本語言對比
對于Shell腳本來說,shell腳本中的函數(shù)只能先定義后使用,函數(shù)可以看做是一個微小版的shell腳本,功能語法相對簡單
#!/bin/bash# 帶關(guān)鍵字定義 function f(){echo $(date) } f# 直接函數(shù)名的方式定義 func_name(){echo "Hello,Word!" } func_name# 接受入?yún)?/span> func_names(){echo "${0}"echo "${1}" } func_names 5# 返回數(shù)組 func_array(){my_array=("liruilong" 1 2 3)echo ${my_array[*]} } retuens=($(func_array)) echo "${retuens[*]}"# 返回信號 func_return(){return 1 } func_return=========================== 2022年 04月 14日 星期四 10:36:20 CST Hello,Word! fun.sh 5 liruilong 1 2 3對于Python來講,函數(shù)也必須先定義后使用。python的函數(shù)語法要多一點,支持可變參數(shù),關(guān)鍵字參數(shù),缺省參數(shù),同時支持拆包,閉包等
#!/usr/bin/python3 # -*- coding: UTF-8 -*-def func_demo():print("Hello,Word") func_demo()def func_param(a,b,c=","):print(a,c,b) func_param("Hello","Word") func_param(b="Word",a="Hello")def func_return():return 2 print(func_return())def func_arges(a,*arges):for i in arges:print(i) func_arges(1,2,3) func_arges(1)def func_aeges_(**arges):print(arges) func_aeges_(name='liruilong', age=18, id=110)def return_num():return 100, 200 num1, num2 = return_num() ========================== Hello,Word Hello , Word Hello , Word 2 2 3 {'name': 'liruilong', 'age': 18, 'id': 110}關(guān)于函數(shù)介紹到這里,來看看方法,GO語言中方法實際上也是函數(shù),只是在聲明時,在關(guān)鍵字func和方法名之間增加了一個參數(shù)
在面向?qū)ο罄?#xff0c;方法是類行為和對象行為的體現(xiàn)(類方法和實例方法),GO不是面向?qū)ο箢愋偷恼Z言,但是Go方法和java中的方法類似,同樣不能單一存在,必須要綁定。
Java中的方法
/*** @Classname Function* @Description TODO* @Date 2022/4/14 23:09* @Created LiRuilong*/ public class Function {String str;// 對象方法public String getStr(){return str;}// 類方法public static Function build(){return new Function();}public static void main(String[] args) {System.out.println("Hello,Word!");} }java中方法必定是和類或者對象綁定的,和類綁定的方法被稱為靜態(tài)方法,和對象綁定的為實例方法。GO中的方法必須要和接收者綁定,那GO中的所謂的接收者又是什么?,即用戶定義的類型,聽著有些別扭,類比C中我們常講的結(jié)構(gòu)體
用戶定義的類型(結(jié)構(gòu)體)
Go 語言允許用戶定義類型(結(jié)構(gòu)體)。當用戶聲明一個新類型時,這個聲明就給編譯器提供了一個框架,告知必要的內(nèi)存大小和表示信息
Go 語言里聲明用戶定義的類型有兩種方法。最常用的方法是使用關(guān)鍵字struct,它可以讓用戶創(chuàng)建一個結(jié)構(gòu)類型。
結(jié)構(gòu)里每個字段都會用一個已知類型聲明。這個已知類型可以是內(nèi)置類型,也可以是其他用戶定義的類型。
- 聲明一個結(jié)構(gòu)類型
- 使用結(jié)構(gòu)類型聲明變量,并初始化為其零值
當聲明變量時,這個變量對應的值總是會被初始化。這個值要么用指定的值初始化,要么用零值(即變量類型的默認值)做初始化
- 對數(shù)值類型來說,零值是 0;
- 對字符串來說,零值是空字符串;
- 對布爾類型,零值是 false。
:=:一個短變量聲明操作符在一次操作中完成兩件事情:聲明一個變量,并初始化
- 使用結(jié)構(gòu)字面量來聲明一個結(jié)構(gòu)類型的變量
- 使用結(jié)構(gòu)字面量創(chuàng)建結(jié)構(gòu)類型的值
- 不使用字段名,創(chuàng)建結(jié)構(gòu)類型的值,這種形式下,值的順序很重要,必須要和結(jié)構(gòu)聲明中字段的順序一致。
當聲明結(jié)構(gòu)類型時,字段的類型并不限制在內(nèi)置類型,也可以使用其他用戶定義的類型
- 使用其他結(jié)構(gòu)類型聲明字段
另一種聲明用戶定義的類型的方法是,基于一個已有的類型,將其作為新類型的類型說明。
- 基于 int64 聲明一個新類型
Duration 是一種描述時間間隔的類型,單位是納秒(ns)。這個類型使用內(nèi)置的 int64 類型作為其表示
我們把 int64 類型叫作 Duration 的基礎(chǔ)類型,Go 并不認為 Duration 和 int64 是同一種類型。這兩個類型是完全不同的有區(qū)別的,這里和有些面向?qū)ο蟮恼Z言有很大的區(qū)別。
- 給不同類型的變量賦值會產(chǎn)生編譯錯誤
OK,了解了GO中的結(jié)構(gòu)體,我們來看看方法
方法
在GO中,通過方法能給用戶定義的類型也就是俗稱的結(jié)構(gòu)體添加新的行為。聲明時,func和方法名之間增加了一個結(jié)構(gòu)體參數(shù)
我們把關(guān)鍵字func和函數(shù)名之間的參數(shù)被稱作接收者,將函數(shù)與接收者的類型綁在一起。如果一個函數(shù)有接收者,這個函數(shù)就被稱為方法。
Go 語言里有兩種類型的接收者:值接收者,指針接收者。
使用值接收者聲明一個方法
// notify 使用值接收者實現(xiàn)了一個方法 func (u user) notify() {fmt.Printf("Sending User Email To %s<%s>\n",u.name,u.email) }如果使用值接收者聲明方法,調(diào)用時會使用這個值的一個副本來執(zhí)行。使用 bill 的值作為接收者進行調(diào)用,方法 notify 會接收到 bill 的值的一個副本。
// user 類型的值可以用來調(diào)用使用值接收者聲明的方法bill := user{"Bill", "bill@email.com"}bill.notify()也可以使用指針來調(diào)用使用值接收者聲明的方法,使用指向 user 類型值的指針來調(diào)用 notify 方法
// 指向 user 類型值的指針也可以用來調(diào)用使用值接收者聲明的方法lisa := &user{"Lisa", "lisa@email.com"}lisa.notify() //(*lisa).notify()指針被解引用為值,不管是變量調(diào)用還是指針調(diào)用,notify 操作的都是一個副本。
使用指針接收者聲明一個方法
// changeEmail 使用指針接收者實現(xiàn)了一個方法 func (u *user) changeEmail(email string) {u.email = email }使用指針接收者聲明。這個接收者的類型是指向 user 類型值的指針,而不是 user 類型的值。當調(diào)用使用指針接收者聲明的方法時,這個方法會共享調(diào)用方法時接收者所指向的值
這一點和使用值接收有很大的區(qū)別,某種意義上講,使用值接收一般用于消費,使用指針接收,一般用于生產(chǎn)加工修飾。
lisa := &user{"Lisa", "lisa@email.com"} // 指向 user 類型值的指針可以用來調(diào)用使用指針接收者聲明的方法 lisa.changeEmail("lisa@newdomain.com") lisa.notify()值接收者使用值的副本來調(diào)用方法,而指針接受者使用實際值來調(diào)用方法。
bill := user{"Bill", "bill@email.com"} // user 類型的值可以用來調(diào)用使用指針接收者聲明的方法 bill.changeEmail("bill@newdomain.com") bill.notify() //(&bill).changeEmail ("bill@newdomain.com")Go語言既允許使用值,也允許使用指針來調(diào)用方法,不必嚴格符合接收者的類型
// 聲明 并使用方法 package mainimport ("fmt" )// user 在程序里定義一個用戶類型 type user struct {name stringemail string }// notify 使用值接收者實現(xiàn)了一個方法,一般用于消費對象 func (u user) notify() {fmt.Printf("Sending User Email To %s<%s>\n",u.name,u.email) }// changeEmail 使用指針接收者實現(xiàn)了一個方法,一般用于生產(chǎn)加工對象 func (u *user) changeEmail(email string) {u.email = email }// main 是應用程序的入口 func main() {// user 類型的值可以用來調(diào)用使用值接收者聲明的方法bill := user{"Bill", "bill@email.com"}bill.notify()// 指向 user 類型值的指針也可以用來調(diào)用使用值接收者聲明的方法lisa := &user{"Lisa", "lisa@email.com"}lisa.notify()// user 類型的值可以用來調(diào)用使用指針接收者聲明的方法bill.changeEmail("bill@newdomain.com")bill.notify()// 指向 user 類型值的指針可以用來調(diào)用使用指針接收者聲明的方法lisa.changeEmail("lisa@newdomain.com")lisa.notify() } ================ [Running] go run "d:\GolandProjects\code-master\chapter5\listing11\tempCodeRunnerFile.go" Sending User Email To Bill<bill@email.com> Sending User Email To Lisa<lisa@email.com> Sending User Email To Bill<bill@newdomain.com> Sending User Email To Lisa<lisa@newdomain.com>[Done] exited with code=0 in 2.288 seconds總結(jié)
以上是生活随笔為你收集整理的GO语言实战之函数与方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1051. 复数乘法 (15)
- 下一篇: RGB取色器在线取色