Golangベース(5):関数について


こんにちはJunior開発者Eonです
今期の記事では、関数について説明します.

📌 関数:function


関数は数学でf(x)で表される.
関数f(x)は、任意の式を含む.
f(x) = x + 5
f(3) = 3 + 5 = 8
このように表現します
コンピュータの関数は数学の関数とは異なり、異なる言語で使用する方法は少し異なるだけです.
入力値の出力値、これが関数です.
入力値3をf(x)という関数に入れ、関数の動作で5を加算して出力値8に戻る.
コンピュータ上の関数も入力値と戻り値で構成され、プログラムを構成するために使用されます.

📍 The rule of naming in Golang


Golangで変数または関数名を作成する方法は固定されており、これは非常に簡単です.
(名前を悩んだだけで…)
現在のパッケージ以外でも使用できるようにするには、大文字[Unicode up case letter(Unicode class"LU")];
現在のパッケージでのみ使用できるようにするには、他のアルファベットで始めます.
これはユーザー間の約束ではなく、Golang自体の機能です.
アルファベット以外の文字として宣言された変数または関数は、外部パッケージでは使用できません.
go.dev/ref/spec#Exported_identifiers

変数または関数の名前をハングルで付ける


GolangのデフォルトコードはUTF-8です.
したがって、ハングル名を宣言することができます.
UTF-8文字をパッケージ外で使用できるようにするには、文字の前に英語の文字を付ける必要があります.
「ハングル関数」=>「Aハングル関数」
「ハングル変数」=>「Aハングル変数」

📍 The format of function in Golang


Golangの関数は次のように使用できます.
func NameOfFunc(a int, b int) (isTrue bool) {
	isTrue = (a == b)
	return
}
  • func:関数(関数)の略で、関数を定義するときは
  • を含む必要があります.
  • NameOfFunction:外部パッケージ
  • に使用できるアルファベットで始まる関数の名前
  • (a int,b int):
  • 関数で使用されるパラメータaとbをそれぞれintとして宣言する
  • (isTrue bool):関数の戻り値を変数isTrueとし、その変数はboolタイプ
  • である.
  • { ... } : 関数の内容を記述する部分は、
  • を自由に記述することができる.
  • isTrue=(a==b):比較演算子"=="を使用して、変数aとbが同じかどうかを確認します.
  • a=bが真の場合trueを返し、偽の場合falseを返す
  • return:戻り値->戻り値を変数isTrueとして指定するため、変数名
  • を記入する必要はありません.
    次は同じ機能の異なる関数です.
    func nameOfFunc(a, b int) bool {
    	isTrue := (a == b)
    	return isTrue
    }
  • nameOfFunc:関数名、LUクラス以外の文字、外部から
  • にパッケージできません.
  • (a,b int):変数aとbはintタイプであり、1回の宣言
  • bool:戻り値のタイプのみを指定し、戻り値
  • を指定しない.
  • isTrue:=(a==b):isTrue変数を(a==b)結果値に一致するタイプ
  • として宣言します.
  • はisTrueを返します:boolタイプ変数isTrueは
  • を返します.
    注意:Golangには3つの演算子はありません.return (a == b) ? true:falseと思いますが、Golangでは不可能です.
    go.dev/doc/faq#Does_Go_have_a_ternary_form

    📍 The usage of function in Golang


    Golangが関数を使用する方法:
    以下に示すように、プロジェクトで直接作成するか、外部パッケージをインポートしてパッケージの関数を使用できます.
    main関数で作成した関数を使用する方法を次に示します.
    package main
    
    import "fmt"
    
    func nameOfFunc(a, b int) bool {
    	isTrue := (a == b)
    	return isTrue
    }
    
    func main() {
    	isOk := nameOfFunc(3, 5)
    	fmt.Println(isOk)
    }
  • packageMain:main package;
  • はこの計画のパッケージです
  • import「fmt」:
  • をインポートし、次の主関数の結果値を出力します.
  • func main() { ... } : main関数にはパラメータと戻り値がない必要があります.プログラムを実行すると、最初に実行された関数であるため、パラメータは渡されません.main関数の内容が順番に実行され、main関数がすべて実行されると、プログラムは
  • を終了します.
  • isOk:=nameOfFunc(3,5):isOkという変数を宣言します.値はnameOfFunc(3,5)の戻り値
  • です.
  • nameOfFunc(3,5):パラメータ3および5をnameOfFunc()関数に渡し、上記nameOfFunc()関数の変数aおよびbとしてそれぞれ使用する
    これらの機能はすべて関数によって実現され、これらの機能を総合的に利用してプログラムを作成することができる.

    📍 The recursive function in Golang


    再帰関数は再帰関数と呼ばれます.
    関数は、独自のメソッドを呼び出します.
    このやり方は人気がありません.call stackがたくさん積まれる可能性があるからです.

    上の図に示すように、main()はrecursiveAddFunc()を呼び出し、ここでrecursiveAddFunc()を再度呼び出します.
    このように繰り返し、逃走条件に遭遇して値を返すと、
    一度、この値はmain()ではなく、callスタックの一番上の関数から前の関数に戻り、前の関数に戻り、前の関数に戻り、前の関数に戻ります...
    最終的に得たい値も関数呼び出しの回数を返す必要があるため,効率が低下する.
    可能な限り多くの重複機能を実行する必要がある場合は、重複文を使用し、必要に応じて再帰関数のみを使用することをお勧めします.
    Golangでは、次の方法で再帰関数を実現できます.
    package main
    
    import "fmt"
    
    func recursiveAddFunc(a, b int) int {
    	a += b
    	if a < 100 {
    		fmt.Println("Before recursive call, a is :", a)
    		a = recursiveAddFunc(a, b)
    		fmt.Println("After recursive call, a is :", a)
    	}
    	return a
    }
    
    func main() {
    	fmt.Println(recursiveAddFunc(5, 3))
    }
  • a+=b:aにbを加えるとaに等しい
  • if a < 100 { ... } : aが100未満の場合、条件文内の内容を実行する.このコードの再帰関数エスケープ条件として使用され、aが100より大きい場合、if条件文を超えてreturn aを実行します.
  • a=recursiveAddFunc(a,b):再帰関数を呼び出し、戻り値をaに代入する
  • func main(){fmt.Println(5,3)}:再帰AddFunc(5,3)の戻り値
  • を出力する
    上記のコードを実行することで、再帰関数の動作をよりよく理解することができます.

    📍 例:計算機


    次はGolangで書かれた簡単な4つの演算プログラムです.
    このプログラムはまだ条件文に関与していません.関数としてのみ実装され、すべての演算の結果が一度に出力されます.
    package main
    
    import "fmt"
    
    func addFunc(a, b int) int {
    	return a + b
    }
    func subFunc(a, b int) int {
    	return a - b
    }
    func mulFunc(a, b int) int {
    	return a * b
    }
    func divFunc(a, b int) int {
    	return a / b
    }
    func modFunc(a, b int) int {
    	return a % b
    }
    func main() {
    	var x, y int
    	fmt.Println("write two values to calculate..")
    	fmt.Println("format : 'value1 value2' then 'press Enter'")
    	fmt.Scanf("%d %d", &x, &y)
    	fmt.Println("result of addFunc(x, y) is :", addFunc(x, y))
    	fmt.Println("result of subFunc(x, y) is :", subFunc(x, y))
    	fmt.Println("result of mulFunc(x, y) is :", mulFunc(x, y))
    	fmt.Println("result of divFunc(x, y) is :", divFunc(x, y))
    	fmt.Println("result of modFunc(x, y) is :", modFunc(x, y))
    }
    実行後、2つの値を入力して演算を実行すると、結果が出力されます.
    この文章は関数についてです.
    Goにも匿名関数があります.でも後で処理します
    ありがとうございます.👍