Help us understand the problem. What is going on with this article?

Go言語 構造体に対する関数とメソッド

Go言語 構造体

type Student struct{
  id int
  first, last string
}

予約語「type」と「struct {}」を用いて定義する。
Goにはクラスがないが、クラスみたいなもの。
{}の中にフィールド名と型を書く。

フィールドの小文字・大文字
小文字・・・そのpackage内でしか呼び出せない
大文字・・・外部のpackageからも呼び出せる

この構造体に対して関数を使う場合とメソッドを使う場合でどう異なるか。苗字と名前をフルネームで表示する関数とメソッドを書いて見比べた。

関数を使う

package main

import "fmt"

//構造体の定義
type Student struct{
    id int
    first,last string
}

//関数
func Name(s Student)string{
    return s.first + " " + s.last
}


func main(){
    s := Student{1,"yamada","taro"}
    fmt.Println(Name(s))
}

//yamada taroと表示される

このままだとStudentという構造体にname関数は紐づいていない。オブジェクト指向ではない。

メソッド

package main

import "fmt"

//構造体の定義
type Student struct{
    id int
    first,last string
}


//メソッド
func (s Student)Name()string{
    return s.first + " " + s.last
}

func main(){
    s := Student{1,"Hanako","Yamada"}
    fmt.Println(s.Name())
}
//yamada taroと表示される

では、sの実体を変えるにはどうするのか

ポインタレシーバ

ポインタで書くことでその実体を書き換える。

package main

import "fmt"

type Student struct{
    id int
    first,last string
}

//ポインタを使用してsの実体ごと変更してしまう。ポインタを使わなければ実体の中身は変更されない!
func (s *Student)Marry(){
    s.last = "Tanaka"
}

func main() {
    s := Student{1, "Hanako", "Yamada"}
    s.Marry()
    fmt.Println(s)
}

//{1 Hanako Tanaka}

まとめ

構造体に対する関数はName(s)
(ここでのsは構造体を指す)

func Name(s Student)string{
   return s.first + " " + s.last
}

構造体に対するメソッドはs.Name()

func (s Student) Name()string{
   return s.first + " " + s.last
}
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away