Go xmas2020 全英課程 08 學習筆記、Functions, Parameters & Defer

来源:https://www.cnblogs.com/linxiaoxu/archive/2022/04/05/16101379.html
-Advertisement-
Play Games

08-Functions, Parameters、 functions、 first class、 function signatures、 parameter、 pass by value、 p... ...


課程地址 go-class-slides/xmas-2020 at trunk · matt4biz/go-class-slides (github.com)

主講老師 Matt Holiday

image-20220401081031592

08-Functions, Parameters

functions

first class

image-20220405052151396

image-20220405052410972

你可以在函數體內聲明函數,但必須是匿名函數,作為一個變數


function signatures

image-20220405052615027

函數簽名指的是 函數參數類型與排列順序、函數返回值


parameter

image-20220405052951913

image-20220405053010574

pass by value

func do(b [3]int) int {
	b[0] = 0
	return b[1]
}

func main() {
	a := [3]int{1, 2, 3}
	v := do(a) // ^ 數組被覆制到函數的局部變數
	fmt.Println(a, v)
}
[1 2 3] 2

pass by reference

func do(b []int) int {
	b[0] = 0
	fmt.Printf("b2 @ %p\n", b)
	b = append(b, 100)
	b = append(b, 100)
	fmt.Printf("b3 @ %p\n", b)
	return b[1]
}

func main() {
	a := []int{1, 2, 3}
	fmt.Printf("b1 @ %p\n", a)
	v := do(a) // ^ 切片被覆制到函數的局部變數
	fmt.Println(a, v)
}
b1 @ 0xc00012c078
b2 @ 0xc00012c078
b3 @ 0xc00013e060
[0 2 3] 2

func do(m1 map[int]int) {
	m1[3] = 0              // ^ 兩個描述符和相同的哈希表,且哈希表有三個鍵,因此修改m1,m被修改
	m1 = make(map[int]int) // ^ 分配了新映射,但m不會被改變
	m1[4] = 4
	fmt.Println("m1", m1)
}

func main() {
	m := map[int]int{4: 1, 7: 2, 8: 3}
	do(m)
	fmt.Println(m)
}
m1 map[4:4]
map[3:0 4:1 7:2 8:3]

the ultimate truth

image-20220405054837612

go 里只有值傳遞,函數內的變數都是局部變數,它被分配、拷貝實際參數的值,假如傳入的是切片描述符,它也是被覆制到局部變數里的。描述符被覆制,切片底層數據沒有被覆制。


returns

image-20220405055316730


Recursion

image-20220405055450508

遞歸運行比迭代慢因為要創建一系列堆棧幀。


08-Defer

image-20220405055759385

image-20220405055925498

defer gotcha #1

image-20220405060115943

image-20220405060316700

Defer is based on function scope

第二個例子中,只有退出函數才會執行 defer 將會打開很多文件導致程式崩潰。所以直接使用 f.close 關閉文件。


defer gotcha #2

image-20220405060649324

defer 執行時,以參數實際的值拷貝傳遞進延遲函數並壓入 defer棧 中,而不是引用。


image-20220405060931635

當我離開函數時執行延遲堆棧,延遲的匿名函數修改返回值 a


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這兩天都是在跟文件打交道,很有趣,每一步都不會順心如意,但每一步的解決都有所獲益,首先是對文件變化的監測,能找到很多辦法,例如通過ELK家族的Filebeat工具來探測,但是外部工具不好融合進Storm,最好是自己寫Java程式來監測。 引入Java NIO 監控文件 其實jdk7以上版本就有一個比 ...
  • 一、概述 Hadoop是Apache軟體基金會下一個開源分散式計算平臺,以hdfs(Hadoop Distributed File System)、MapReduce(Hadoop2.0加入了YARN,Yarn是資源調度框架,能夠細粒度的管理和調度任務,還能夠支持其他的計算框架,比如spark)為核 ...
  • 之前瞭解過postgresql的Bitmap scan,只是粗略地瞭解到是通過標記數據頁面來實現數據檢索的,執行計劃中的的Bitmap scan一些細節並不十分清楚。這裡藉助一個執行計劃來分析bitmap scan以及index only scan,以及兩者的一些區別。這裡有關於Bitmap sca ...
  • 註意 一定要按照步驟激活 第一步:打開註冊機器,然後點擊patch,找到安裝Navicat15目錄下麵的exe文件 第二步:打開Navicat啟動文件,然後點擊註冊按鈕,然後點擊註冊機器的Generate按鈕,把文本中的內容填寫進去,然後點擊註冊,這時候會顯示註冊失敗,然後點擊手動激活 第三步,在註 ...
  • web前端開發規範 規範概述 一個人走的更快,一群人可以走的更遠,前提是統一的策略,還要不斷地反省和優化。不管有多少人共同參與同一項目,儘可能確保每一行代碼都像是同一個人編寫的 開發目錄規範 開發環境規範 開發編碼規範 一、目錄及文件命名規範 (一)、例靜態專題頁目錄 - src / html 源代 ...
  • 一、首先需要需要引入需要的包 <script src="https://cdn.bootcss.com/xlsx/0.11.5/xlsx.core.min.js"></script> 二、一個上傳文件的file類型的input標簽 <input type="file" onchange="showP ...
  • 註意如果你的mac是M1處理器 那抱歉當前文章可能不支持了,因為當前模擬器不支持。 3步完成mac uniapp 模擬器配置 1.下載網易mumu模擬器 https://mumu.163.com/mac/index.html 2.安裝 設置 下載完成後安裝運行就是這樣的 選擇屏幕旋轉 手機模式 3. ...
  • 工廠方法模式是什麼 工廠方法模式是一種創建型設計模式, 其在父類中提供一個創建對象的方法, 允許子類決定實例化對象的類型。 為什麼用工廠方法模式 在新增一個產品時,不用去修改已有的代碼。工廠方法將創建產品的代碼與實際使用產品的代碼分離,從而能在不影響其他代碼的情況下擴展產品創建部分代碼。例如,如果需 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...