Go言語の基本機能を理解するための記事(後編)
最後のメインレビュー
上記のことから、関数を定義する場合、関数のメモリ割り当ては次のように理解できることがわかります。
#同時に、どのような操作が実行されても ## のみが操作されることもわかります。 # stack 上記の は の価値があります。
#関数と変数
関数名はvariable
このように変数を定義して関数を受け取ることを考えたことがあるかどうかはわかりません。
package main
import "fmt"
func say() {
fmt.Println("say")
}
func main() {
var s1 = say
s1()
}
変数
を通じて、次のことがわかります。 #関数名 # を受け取りますが、変数名括弧を使用して実行する場合は問題ありません 。 それでは、この変数はどのような型でしょうか? ? ? fmt.Printf("%T\n",s1)
执行结果
如果我将say函数改一下呢?
func say(s int) int{ fmt.Println("say") return 1 }
fmt.Printf("%T\n",s1)
可以发现,如果函数参数和返回值不一样,打印出来的类型也是不一样的。
定义函数类型
上述我们知道,可以通过变量接收一个函数名。
通过变量接收函数名是没有约束的,不管函数几个参数,几个返回值,都可以接收,真是活出了动态语言的样子。
而定义函数类型就是限制变量接收函数,只能接收指定格式的函数。
主要用到type
关键字。
格式
type 变量名 func([参数类型,参数类型]) [返回值类型] 中括号表示可选参数
例如
type a func() type b func(int) type a func(int,int) int
具体代码
package main import "fmt" /* 定义一个函数类型的变量 接收的函数参数必须是两个int类型 函数的返回值也必须是int类型 */ type cType func(int, int) int func say1(a, b int) int { fmt.Println("say",a+b) return 1 } func say2(a, b int) { fmt.Println("say") } func main() { var s1 cType s1 = say1//调用s1其实调用的就是say1 s1(1,1) //var s2 cType //s2 = say2//报错,cannot use say2 (type func(int, int)) as type cType in assignment }
高阶函数
千万不要被这个名字唬住了。
简单点说,高阶函数就是把函数当作参数或者把函数当作返回值。
函数当作参数
package main import "fmt" func add(x int, y int) int { return x + y } func calc(x int, y int, other func(int, int) int) int { return other(x, y) } func main() { //将add函数传入第三个参数 var result = calc(34, 12, add) fmt.Println(result) }
函数当作返回值
package main import "fmt" func add(x int, y int) int { return x + y } func test() (func(int, int) int) { return add } func main() { var a = test() fmt.Println(a(1,2)) }
至于上述两个的功能,恕小生不才,至今用到的场景不多。
匿名函数
匿名函数顾名思义,就是没有名字的函数。
语法如下
func([参数,参数...])[(返回值,返回值)]{ 代码 }() //匿名函数后面必须跟括号,直接执行
例如
func() { }() func(x int, y int) (int) { return x + y }()
代码
package main import "fmt" func main() { //s1等于一个匿名函数,并且直接执行 var s1 = func(x int, y int) (int) { return x + y }(1,2) fmt.Println(s1) }
闭包
闭包,这个有点不太理解,简单点说就是函数里面套了一个函数,里面函数引用的外面函数的变量。
示例
package main import "fmt" func other() func() { //返回的是一个函数类型 var a = 666 return func() { //内部函数使用的是外面函数的a fmt.Println(a) } } func main() { var o = other() o() }
执行结果。
结果是没有问题的。
虽然我们以前学过,函数执行完毕后,里面的变量会回收。
しかし、クロージャを使用する場合、内部関数が外部関数の変数を使用する場合、その変数はリサイクルされないことが理解できます。
##概要
この記事では主にについて説明します。 関数と変数,#高階関数,#匿名関数, Closure, このうち、Closed は理解が難しいため、時間をかけて行う必要があります。剣の刃は研ぐことから生まれ、梅の香りは厳しい寒さから生まれます、もっと練習しなければなりません。
以上がGo言語の基本機能を理解するための記事(後編)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

SQL.Openを使用する場合、DSNがエラーを報告しないのはなぜですか? GO言語では、sql.open ...
