質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

2回答

695閲覧

【Go】構造体を作成したあと、メソッドか関数でどちらを作成すればいいか迷ってしまいます。

nyako

総合スコア45

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2022/07/01 06:17

以下のようなコードを写経して一部を書いてみたのですが、書いてる途中に疑問に思ったので質問させて頂きます。

タイトルにもある通りですが、構造体を書いてメソッドにするのか関数にするのか?ということです。

まずSave()をメソッドにするのか関数にするのかというところで、確かにPageの構造体に紐づいている処理なのでわかる気もしますが
LoadPage()の方はメソッドでもいいのでは?と思ってしまいます。

宜しくお願いいたします。

コードはGoのチュートリアルにある簡単なWebApplicationです。Txtファイルを保存したり読み込んだりします。

go

1type Page struct { 2 Title string 3 Body []byte 4} 5 6func (p *Page) Save() { 7 filename := p.Title + ".txt" 8 return ioutill.Writefile(filename, p.Body, 0666) 9} 10 11func LoadPage(title string) (*Page, error) { 12 filename := title + ".txt" 13 body, err := ioutill.Readfile(filename) 14 if err != nil { 15 return nil, err 16 } 17 return &Page{Title: title, Body: body}, nil 18} 19 20 21func main() { 22 p1 := &Page{Title: "test", Body: []byte("this is a sample page")} 23 p1.Save() 24 25 p2, _ := LoadPage(p1.Title) 26 fmt.Println(string(p2.Body)) 27}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

メソッドにする場合は一例として以下の様になるかと思いますが、呼び出し側でインスタンスを作成する必要があります。

go

1func (p *Page) Load(title string) (*Page, error) { 2 filename := title + ".txt" 3 body, err := ioutil.ReadFile(filename) 4 if err != nil { 5 return nil, err 6 } 7 p.Title, p.Body = title, body 8 return p, nil 9} 10 11func main() { 12 p1 := &Page{Title: "test", Body: []byte("this is a sample page")} 13 p1.Save() 14 15 p2, err := new(Page).Load(p1.Title) 16 if err != nil { 17 panic("can not load page") 18 } 19 fmt.Println(string(p2.Body)) 20}

投稿2022/07/01 07:15

編集2022/07/01 07:21
melian

総合スコア19703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

絶対的にだめとは言いませんが、使い方を考えると必然的に関数になるかと。

あまりGo言語は使っていませんが、C#等から考えると、メソッドにした場合は必ずオブジェクトがないと動かせないです。
つまりp.bodyのようにオブジェクト.メソッド(…)としないといけないはずです。

でもLoadPage関数をメソッドにしてしまうと、
LoadPageメソッドを動かそうとするとどうしてもPageのオブジェクトが必要になる。
でもこのオブジェクトはLoadPageで生成する必要がある。でもLoadPageはPageのオブジェクトが必要…と自己矛盾に陥ってしまいます。
どうしてもメソッドにするならダミーのPageのオブジェクトを作ってそのオブジェクトでLoadPageメソッドで本来のオブジェクトを生成しないといけません。
デザインパターンのFactoryMethodパターン等のようにあえてそういう方法を取るのでないならわざわざメソッドにするメリットが全くありません。むしろ関数として完全に別のものとしておくほうがわかりやすいですし使いやすいですね。

投稿2022/07/01 06:47

編集2022/07/01 06:48
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問