日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GO语言实战之函数与方法

發(fā)布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GO语言实战之函数与方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

寫在前面

  • 嗯,學習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)類型
type user struct {name stringemail string }
  • 使用結(jié)構(gòu)類型聲明變量,并初始化為其零值
var bill user

當聲明變量時,這個變量對應的值總是會被初始化。這個值要么用指定的值初始化,要么用零值(即變量類型的默認值)做初始化

  • 對數(shù)值類型來說,零值是 0;
  • 對字符串來說,零值是空字符串;
  • 對布爾類型,零值是 false。

:=:一個短變量聲明操作符在一次操作中完成兩件事情:聲明一個變量,并初始化

  • 使用結(jié)構(gòu)字面量來聲明一個結(jié)構(gòu)類型的變量
lisa := user{name: "liruilong",email: "liruilong@qq.com" }
  • 使用結(jié)構(gòu)字面量創(chuàng)建結(jié)構(gòu)類型的值
user{name: "liruilong",email: "liruilong@qq.com" }
  • 不使用字段名,創(chuàng)建結(jié)構(gòu)類型的值,這種形式下,值的順序很重要,必須要和結(jié)構(gòu)聲明中字段的順序一致。
user{"Bill", "bill@email.com"}

當聲明結(jié)構(gòu)類型時,字段的類型并不限制在內(nèi)置類型,也可以使用其他用戶定義的類型

  • 使用其他結(jié)構(gòu)類型聲明字段
type admin struct{liruilong user,leve string } fred := admin{liruilong: user{"Bill", "bill@email.com"},level: "super", }

另一種聲明用戶定義的類型的方法是,基于一個已有的類型,將其作為新類型的類型說明。

  • 基于 int64 聲明一個新類型
type Duration int64

Duration 是一種描述時間間隔的類型,單位是納秒(ns)。這個類型使用內(nèi)置的 int64 類型作為其表示

我們把 int64 類型叫作 Duration 的基礎(chǔ)類型,Go 并不認為 Duration 和 int64 是同一種類型。這兩個類型是完全不同的有區(qū)別的,這里和有些面向?qū)ο蟮恼Z言有很大的區(qū)別。

  • 給不同類型的變量賦值會產(chǎn)生編譯錯誤
package mainimport ("fmt" ) type Duration int64func main() {var dur Duration//正確寫法 ur = Duration(1000) dur = int64(1000)fmt.Println(dur) }============ [Running] go run "d:\GolandProjects\code-master\demo\hello.go" # command-line-arguments demo\hello.go:10:6: cannot use int64(1000) (type int64) as type Duration in assignment[Done] exited with code=2 in 0.705 seconds

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。