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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

1回答

238閲覧

go言語 : interface{}型の扱いについて

rrh

総合スコア15

Go

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2019/02/28 08:26

当方Goの勉強をしている者ですが、
Go言語の文法に関して、不明確な点が一つあります。

interface{}型に関してなのですが、

database/sqlなど、Goの多くのパッケージ、フレームワークの関数、メソッドで引数にinterface{}型をとるものを多く見かけます。
(echoフレームワークのContextインターフェースの各メソッドなど)

こういったinterface{}型の引数には、値を渡してもポインタを渡しても良いものなのでしょうか?

例えば、echoフレームワークでContextインターフェースのBindメソッドを使う時、

params := &ExampleStruct{} echo.Context.Bind(params)

となると思うのですが、このparamsが構造体のスライスであるときには

params := []ExampleStruct{} echo.Context.Bind(params)

となるのでしょうか?

またparamsが単一の構造体である時でも

params := ExampleStruct{} echo.Context.Bind(params)

のようにアドレスでなく値を引数に渡すことでも同様に正常に処理されるのでしょうか?

説明がわかりづらく恐縮ですが、回答よろしくお願いいたします。
不明点等あればご質問ください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

どの質問も答えは Yes です。

interface{} というのは、下記の Interface1 のように「レシーバ関数の実装を何も要求されていないインターフェース」と捉えるとわかりやすいかと思います。

go

1package main 2 3type Interface1 interface { 4} 5type Struct1 struct { 6} 7type Struct1Slice []Struct1 8 9func (s Struct1) Run() { 10 println("run") 11} 12func RunByInterface(i Interface1) { 13 println("run by interface") 14} 15 16func main() { 17 s1 := Struct1{} 18 var s2 Struct1Slice 19 20 RunByInterface(s1) 21 RunByInterface(&s1) 22 RunByInterface(s2) 23 RunByInterface(int(1)) 24}

投稿2019/04/18 06:54

pullphone

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問