LoginSignup
76
34

More than 5 years have passed since last update.

Golang入門(関数)

Posted at

Golangの関数について

Golangでは、Javaの様にclass内にメソッドを定義出来ないことは以前の記事で書いたとおりです。

では、どのように構造体毎に関数を定義するのか?
と説明する前に、まず関数の実装について説明しますねー

sample.go
package main

import "fmt"

func p(i interface{}) {
    fmt.Println(i)
}

func main() {
    p("It's sample function")
    p("Do you like Golang?")
}

MacBookPro:Qiita skanehira$ go run sample.go
It's sample function
Do you like Golang?
MacBookPro:Qiita skanehira$

上記は、渡された文字列を標準出力をするだけのシンプルな関数です。
見てわかるとおり、Golangでの関数の実装は以下の様になります。

func 関数名 (引数 ) {
    // do something
}

もちろん、戻り値も定義できます。

package main

import "fmt"

func main() {
    fmt.Println(addOne(1))
}

func addOne(i int) int {
    return i + 1
}

MacBookPro:Qiita skanehira$ go run sample.go
2
MacBookPro:Qiita skanehira$

関数の後ろに戻り値の型を定義することで、
値を返却できる様になります。

func 関数名 (引数 )  {
    // do something
    return 
}

複数の値を返却する時ときはこのように定義します。

func 関数名 (引数 ) (, ) {
    // do something
    return , 
}

言語経験がある方は、すーっと入ってくると思います。

構造体の関数について

関数定義の仕方を理解したところで、
以前の記事で触れた構造体の関数を定義の仕方について書いていきます。

と言っても簡単です。

package main

import "fmt"

type Human struct {
    Name   string
    Age    int
    Weight float32
}

func (h Human) addWeight(f float32) float32 {
    return h.Weight + f
}

func main() {
    // インスタンス生成
    skanehira := Human{
        Name:   "skanehira",
        Age:    24,
        Weight: 60.6,
    }

    fmt.Printf("%#v \n", skanehira)
    skanehira.Weight = skanehira.addWeight(10)
    fmt.Printf("%#v \n", skanehira)
}

つまり、このようになりますね。

type 構造体 struct {
    // フィールド定義
}

func (変数名 構造体) 関数名(変数名 )  {
    // do something
    return 
}

そう、関数の前に「(変数名 構造体)」を付け加えるだけです。
そうすることで、構造体と関数が紐付けられるのです。(正確な言い方がわからなくてごめんなさい)
このように定義すると、Humanのインスタンスが作られないと関数を使用できないのです。

個人的にJavaから入門したので、
このような書き方にすごく違和感を覚えましたが、
まぁ慣れですねー

上記の例は少し、わかりづらいかもですが、
アカウントのCRUDを当てはめて考えると少しイメージし易いかもしれないですね。

package main

import "fmt"

type Account struct {
    ID       string
    Name     string
    Password string
}

// アカウント登録
func (account Account) Create() {
    db.Insert(account)
}

// アカウント情報更新
func (account Account) Update() Account {
    db.Update(account.ID, account)
    return account
}

// アカウント情報取得
func (account Account) Read() Account {
    db.Get(account.ID)
    return account
}

// アカウント削除
func (account Account) Delete() {
    db.Delete(account.ID)
}

func main() {
    account := Account{
        Name:     "skanehira",
        Password: "kanehira1005",
    }

    account.Create()
    account.Update()
    account.Read()
    account.Delete()
}

以上、Golangにおいての関数定義でした。
次回は、継承の概念がないGolangでの構造体拡張について書いていきますっ

76
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
76
34