1. ホーム
  2. スクリプト・コラム
  3. ゴラン

Go言語基本関数の基本的な使い方と例

2022-01-06 12:11:18

概要

関数は、あるタスクを実行するコードの基本ブロックです。

シンタックス

関数定義

func function name( argument list] ) (return value list]){
  Execute the statement
}


I. 関数パラメータ

引数なしノーリターン

func add()


引数と戻り値付き

func add(a, b int) int


関数値の受け渡し

func swap(x,y int) int {
	var temp int
	temp = x
	x = y
	y = temp
    return temp
}


関数の参照渡し

参照渡しとは、関数が呼ばれたときに実引数のアドレスが渡され、関数内で引数に加えられた変更が実引数に影響することです。

func swap(x *int ,y *int) {
   var temp int
   temp = *x // save the value on the x address
   *x = *y // assign the y value to x
   *y = temp // assign temp value to y
}


可変パラメータリスト デフォルトパラメータなし

func funcName(arg ... .type) {
}



func sum(numbers ... .int) int {
    s := 0
    for i:= range numbers {
        s += numbers[i]
    }
    return s
}


パラメータとしての機能

func function(a, b int, f func(a, b int) int) int{
  return f(a, b)
}


//needs to be packaged reflect runtime
func apply(op func(... .int) int, a, b int) (int, string){
   p := reflect.ValueOf(op).Pointer()
   opName := runtime.FuncForPC(p).Name();
   return op(a, b), opName
}


ii. 返り値

複数の戻り値

func eavl(a, b int) (int, int) {
	 return a +b, a-b
}


戻り値をスキップする

q, _ = eavl(2, 1)


匿名機能

は関数名を持たない関数です

func(x, y int) int {
	return x + y
}


匿名関数を変数に代入することができる

f := func() int {
    ...
}


またはセルフコール

func (a,b int) int {
    return a+b
}(1,2)


関数型にメソッドを追加する

 type Greeting func(name string) string


// Greeting 関数型にメソッドを追加する

func (g Greeting) say(n string) {
    fmt.Println(g(n))
}


概要

  1. Go関数は複数の戻り値をサポートする
  2. 関数と呼び出しが同じパッケージ内にない場合、import キーワードを使用して最初にパッケージを取り込む必要があります。
  3. 関数が他のパッケージから呼び出される場合、最初の文字を大文字にする必要があります。
  4. 関数は一級市民であり、変数のように渡すことができる
  5. ポインタ、参照、その他のどのタイプの引数として渡されても、すべて値のコピーとして渡されます。違いは、コピーの対象がターゲット・オブジェクトかポインタのコピーかです
  6. GOの関数は、ネスト、オーバーロード、デフォルト引数をサポートしていません。
  7. GOの関数は、宣言されていない変数、変数の長さ、複数の戻り値、匿名性、クロージャなどをサポートしています。
  8. GOの関数は、funcと左中括弧{で宣言され、別行動はありません。

package main
import "fmt"
import "reflect"
import "runtime"
// i. Function parameters
/* with arguments and return */
func add(a, b int) int {
	return a+b
}
/* function value passing */
// func swap(x,y int) int {
// var temp int
// temp = x
// x = y
// y = temp
// return temp
// }
/* function reference passing */
func swap(x *int ,y *int) {
   var temp int
   temp = *x // save the value at address x
   *x = *y // assign the y value to x
   *y = temp // assign temp value to y
}
/* Variable argument list No default arguments */
func sum(numbers ... .int) int {
    s := 0
    for i:= range numbers {
        s += numbers[i]
    }
    return s
}
/* function as parameter */
func function(a, b int, f func(a, b int) int) int{
  return f(a, b)
}
//need to guide package reflect runtime
func apply(op func(.. .int) int, a, b int) (int, string){
    p := reflect.ValueOf(op).Pointer()
    opName := runtime.FuncForPC(p).Name();
    return op(a, b), opName
}
// i. Return values
/* Multiple return values */
func eavl(a, b int) (int, int) {
		 return a +b, a-b
}
func main() {
	a,b:=20,5
	fmt.Println(add(a, b))
	swap(&a,&b)
	fmt.Println(a,b)
	fmt.Println(sum(a, b))
	fmt.Println(function(a,b,add))
	fmt.Println(apply(sum,a,b))
	fmt.Println(eavl(a,b))
	q, _ := eavl(a, b)
	fmt.Println(q)
}



上記は、Go言語の基本的な関数の使い方と例の詳細です。Go言語の関数に関するより詳しい情報は、スクリプトハウスの他の関連記事にご注目ください