一目で終わる穏やかな基礎-3

5270 ワード

n.関数
4つの形式に分けることができます.
  • パラメータと戻り値を持つ形状:
  • パラメータ、形状
  • 、戻り値なし
  • にはパラメータがなく、形状は
  • で、戻り値があります.
  • パラメータなし、形状
  • 戻り値なし
    /*기능들만 모아놓은 함수들*/
    func guide() { //매개변수 X 반환 값 X
    	fmt.Println("두 정수를 입력받고 곱한 결과를 출력하는 프로그램입니다.\n두 정수를 차례로 띄어 써주세요.")
    	fmt.Print("두 정수를 입력해주세요 :")
    }
    
    func input() (int, int) { //매개변수 X 반환 값 O(두 개)
    	var a, b int
    	fmt.Scanln(&a, &b)
    	return a, b
    }
    
    func multi(a, b int) int { //매개변수 O, 반환 값 O
    	return a * b
    }
    
    func printResult(num int) { //매개변수 O, 반환 값 X
    	fmt.Printf("결과값은 %d입니다. 프로그램을 종료합니다.\n", num)
    }
  • ゾーン変数:ゾーン変数は、ゾーンに宣言された瞬間にメモリを作成し、ゾーンを離れると自動的に破棄されます.
  • グローバル変数には、メモリがなくなるまでコードが複雑になります.
    古語関数のパラメータは領域変数ですか、それともグローバル変数ですか.Pass by value or Pass by reference?
  • Pass by valueの一般(他の言語と同じ)
    package main
    
    import "fmt"
    
    func printSqure(a int) {
    	a *= a
    		
    	fmt.Println(a)
    }
    func main() {
    	a := 4 //지역변수 선언
    		
    	printSqure(a)
    		
    	fmt.Println(a)
    }
    GoはポインタをサポートしているのでPass by Reference
    package main
    
    import "fmt"
    
    func printSqure(a *int) {
    	*a *= *a
    	
    	fmt.Println(*a)
    }
    func main() {
    	a := 4         //지역변수 선언
    	
    	printSqure(&a) //참조를 위한 a의 주솟값을 매개변수로 전달
    	
    	fmt.Println(a)
    }
    かへんパラメータかんすう
  • 事実上のシート伝達方法
  • n個の同じ形状のパラメータ.
  • によって伝達される変数はスライス形式である.変数処理時の処理シートと同様です.
  • 宣言
  • 関数のフォーマットは「func関数名(パラメータ名...パラメータ型)戻り型」です.パラメータ型「前面...」貼ればいい
  • パラメータ伝達シートを使用することができる.他のコレクションタイプは不可能です.スライスを渡すとき、スライス名の後...関数名(シート名...)関数をフォーマットで呼び出せばいいです.
    使用法
  • package main
    
    import "fmt"
    
    func addOne(num ...int) int {
    	var result int
    
    	for i := 0; i < len(num); i++ { //for문을 이용한 num[i] 순차 접근
    		result += num[i]
    	}
    	
    	return result
    }
    
    func addTwo(num ...int) int {
    	var result int
    
    	for _, val := range num { //for range문을 이용한 num의 value 순차 접근
    		result += val
    	}
    	
    	return result
    }
    
    func main() {
    	num1, num2, num3, num4, num5 := 1, 2, 3, 4, 5
    	nums := []int{10, 20, 30, 40}
    
    	fmt.Println(addOne(num1, num2))
    	fmt.Println(addOne(num1, num2, num4))
    	fmt.Println(addOne(nums...))
    	fmt.Println(addTwo(num3, num4, num5))
    	fmt.Println(addTwo(num1, num3, num4, num5))
    	fmt.Println(addTwo(nums...))
    }
    戻り値
    Go言語では、複数の戻り値を返すことができます.
    戻り値は、戻りタイプの合計数を指定する必要があります.
    package main
    
    import "fmt"
    
    func add(num ...int) (int, int) {
    	var result int
    	var count int
    	
    	for i := 0; i < len(num); i++ { //for문을 이용한 num[i] 순차 접근
    		result += num[i]
    		count++
    	}
    	
    	return result, count
    }
    
    func main() {
    	nums := []int{10, 20, 30, 40, 50}
    
    	fmt.Println(add(nums...))
    }
    Named Return Parameter
    戻りタイプのみが書かれています.これは変数名とタイプを一緒に書く方法です.
    別途声明する必要はありません.
    returnは省略できません.
    func dessertList(fruit ...string) (count int, list []string) { //여기서 이미 선언된 것이다
    
    	...
    
    	return //생략하면 안 된다
    }
    匿名関数
    匿名関数は少しユニークです.
  • 関数を宣言すると、グローバルメモリに初期化されます.
  • 機能を実行するたびに、関数を検索して呼び出す必要があるからです.
  • package main
    
    import "fmt"
    
    func main() {
    	func() {
    		fmt.Println("hello")
    	}()
    
    	func(a int, b int) {
    		result := a + b
    		fmt.Println(result)
    	}(1, 3)
    
    	result := func(a string, b string) string {
    		return a + b
    	}("hello", " world!")
    	fmt.Println(result)
    
    	i, j := 10.2, 20.4
    	divide := func(a float64, b float64) float64 {
    		return i / j
    	}(i, j)
    	fmt.Println(divide)
    }
    これは宣言と同時に実行されます.
    上記では、関数の戻り値と名前を宣言することで変数として使用し、戻りのみを返します.匿名関数にも同様の機能があります.
    ただし、変数に初期化された匿名関数は、変数名を関数の名前として使用できます.
    addAnonymous := func(nums ...int) (result int) {
    		for i := 0; i < len(nums); i++ {
    			result += nums[i]
    		}
    		return
    	}
    このように使われていますしかし最終的には宣言関数と同じように...うん...
    宣言関数と匿名関数は、プログラム内の読み取り順序が異なります.プログラムが起動すると、すべての宣言関数が同時に読み込まれます.ただし、匿名関数は上記の例のようにその場で実行されるため、関数が実行されている場所で読み込まれます.つまり、匿名関数は宣言関数ではなく後で読み込まれます.したがって、宣言関数が匿名関数と同じ名前の場合、匿名関数は宣言関数を上書きします.これは、領域変数とグローバル変数の違いと同じです.
    package main
    
    import "fmt"
    
    func add() {
    	fmt.Println("선언 함수를 호출했습니다.")
    }
    
    func main() {
    
    	add := func() {
    		fmt.Println("익명 함수를 호출했습니다.")
    	}
    
    	add()
    }
    いちじかんすう
    匿名関数の使用は、Go言語の関数が「一級関数」であるため可能である.
    他のタイプと比較して、関数は高度な使い方ではなく、同じオブジェクトとして使用できます.
    関数自体をパラメータとして渡すことができます.(次のコードを確認)
    package main
    
    import "fmt"
    //    3. 그럼 매개변수에 다 적어줘야함 (<- 귀찮)
    func calc(f func(int, int) int, a int, b int) int {
    	result := f(a, b)
    	return result
    }
    
    func main() {
    	// 1. 멀티라는 함수를 만들고
    	multi := func(i int, j int) int {
    		return i * j
    	}
    	// 2. calc 함수로 넘김
    	r1 := calc(multi, 10, 20)
    	fmt.Println(r1)
    }
    type文を使用して関数プロトタイプを定義する
    上のコードでは一度見てみると可読性も落ちていて面倒です.
    したがって、type文を使用して関数のプロトタイプを定義し、定義した名前を使用します.
    cにおける構造体概念に類似する.(構造体の名前だけ取って…という記憶…)
    //1. 함수 원형 정의
    type calculatorNum func(int, int) int 
    
    // 4. 함수 선언에 함수 원형정의가 되어있어서 가독성이 좋아졌습니다.
    func calNum(f calculatorNum, a int, b int) int {
    	result := f(a, b)
    	return result
    }
    
    func main() {
    	// 2. 익명함수, 맨위에 함수원형 정의가 되어있습니다.
    	multi := func(i int, j int) int {
    		return i * j
    	}
        
        // 3. 넘깁니다.
    	r1 := calNum(multi, 10, 20)
    	fmt.Println(r1)
    }