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

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

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

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

Q&A

解決済

1回答

1304閲覧

名前がないstructを実装するとgo vetでエラーになる

zonamoshi

総合スコア15

Go

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

0グッド

0クリップ

投稿2021/07/13 02:05

いつもお世話になっております。
https://github.com/deepmap/oapi-codegen というOpenAPIから
golangサーバー(自分はechoを使ってます) のスタブを出してくれるツールがあるのですが
そこで問題があります。

困っていること

時間を取り扱うOepnAPIの要素の場合、 types をgenerateすると、
下記の通り、structの実装部分でエラーになります。

golang

1func generateEstimateItem() EstimateItem { 2 var item EstimateItem 3 dummyTime, _ := time.Parse("2006-01-02", "2021-01-01") 4 var currentDate openapi_types.Date = openapi_types.Date{dummyTime} 5 return item 6}

console

1hoge:~/work/temp$ go vet ./... 2# github.com/hoge/temp/api 3api/server.go:27:39: github.com/deepmap/oapi-codegen/pkg/types.Date composite literal uses unkeyed fields

イメージ説明

解消したいこと

ビルドはできるのですが go vet ./... で引っかからない、警告がでない
正しい実装を教えてください。

そもそも oapi-codegen の実装は?

golang

1package types 2 3import ( 4 "encoding/json" 5 "time" 6) 7 8const DateFormat = "2006-01-02" 9 10type Date struct { 11 time.Time 12}

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージが述べている

composite literal uses unkeyed fields

この通りで、構造体リテラルを記述するのに「フィールドキー名」を記述しましょうということです。

つまり、以下の記述は

go

1openapi_types.Date{dummyTime}

以下の様に書きましょうという警告です。

go

1openapi_types.Date{Time: dummyTime}

確かに単独のフイールドであれば省略しても問題ない様に見えますが、将来、openapi_types.Dateのフィールドが増えた時に前者の記述はエラーになり、後者は問題なくコンパイルできます。

補足

ちなみに同パッケージ内定義の構造体リテラルの場合、フィールド数が合っていればgo-vetによる警告は出ません。このパターンで警告になるのは外部パッケージに定義された構造体リテラルを記述するときだけです。(外部パッケージの更新により上記の様なエラーが発生するのを未然に防ぐためと思われます)

投稿2021/07/13 02:31

編集2021/07/13 02:46
nobonobo

総合スコア3367

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

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

zonamoshi

2021/07/13 04:46

ご回答ありがとうございます。修正できました!!! >構造体リテラルを記述するのに「フィールドキー名」を記述しましょうということです。 deeplで警告内容はわかっていたのですがそのフィールドキー名がわかりませんでした。 この場合は型名がフィールドキー名にあたるのでしょうか?
nobonobo

2021/07/14 05:24

フィールド定義では「フィールド名 型名」が一般的ですが、 「型名」だけを書くと「埋め込みフィールド」になります(埋め込まれた型の機能や振る舞いが親の型に「委譲」されます)。 「埋め込みフィールド」へのアクセスには型名を使います。
zonamoshi

2021/07/14 08:39

@nobonobo ご回答ありがとうございます。埋め込みフィールドというのですね!! embedded field inheritanceという名前でググったらたくさん事例が出てきました。 そういうことだったのか...ご丁寧な説明痛み入ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問