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

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

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

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

1481閲覧

Goで構造体配列に値を代入する際のエラー

ts21

総合スコア32

Go

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2021/09/08 09:54

編集2021/09/08 09:55

やりたいこと

Goでハッシュチェーンを実装しています。
Goで書くのはほぼ初めてなのですが、構造体配列の使い方で困っています。

実際に書いたコード

次のようなプログラムを書きました。

Go

1package main 2 3import ( 4 "crypto/sha256" 5 "fmt" 6) 7 8func main() { 9 Array := [...]string{"0001", "0002", "0003", "0004"} 10 h := sha256.New() 11 12 //構造体を定義 13 type Block struct { 14 Index int 15 DataBlock string 16 Hash string 17 } 18 19 //構造体配列を定義 20 type BlockArray []*Block 21 var hashChain BlockArray 22 23 for i := 0; i < len(Array); i++ { 24 if i == 0 { 25 h.Write([]byte(Array[i])) 26 hashChain[i] := Block{i, Array[i], fmt.Sprintf("%x", h.Sum(nil))} 27 fmt.Printf("%x \n", hashChain[i].Hash) 28 }else{ 29 var message string 30 message = Array[i] + hashChain[i-1].Hash 31 h.Write([]byte(message)) 32 hashChain[i] := Block{i, Array[i], fmt.Sprintf("%x", h.Sum(nil))} 33 fmt.Printf("%x \n", hashChain[i].Hash) 34 } 35 fmt.Printf("%x \n", hashChain[i].Hash) 36 } 37} 38

エラー

実行した際のエラーがこちらです

% go run hashChain.go # command-line-arguments ./hashChain.go:38:13: non-name hashChain[i] on left side of := ./hashChain.go:44:13: non-name hashChain[i] on left side of :=

やったこと

型推論が原因かと思い、調べましたがこの記事のように、型推論ではないようです

何かの基礎的知識が抜けているのであれば、そのあたりをご指摘もらえると幸甚です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Goのスライスもマップも要素アクセスのために提供される機能としては
「値」の参照と代入のみです。

「:=」は「新しい変数への束縛」といって単なる「代入」とは挙動が異なります。

「新しい変数への束縛」の挙動は「左辺にあるシンボルで現スコープに新たに変数を作り、その初期値を設定する」というものです。エラーメッセージの内容は「hashChain[i]はシンボル名として不正なので:=の左辺には使えない」ということです。

つまり「:=」じゃなくて「=」を使いましょうということです。

ただ、多値の場合はいずれか一つが「新しい変数名」であれば良いという挙動をとります。
以下ののようなコードは実行可能で、2度目のerrは「単なる代入」の挙動になります。

go

1a, err := func1() 2b, err := func2()

ただし、いずれにせよ「:=」の左辺には「単純変数名」しか置けません。

投稿2021/09/09 01:19

編集2021/09/09 01:35
nobonobo

総合スコア3367

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

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

ts21

2021/09/09 08:05

ご丁寧に回答いただきありがとうございます。スライスやマッピングの挙動について誤解していた部分がありました。 こちらの質問については、同じく@nobonoboさんのおかげで解決いたしました! →https://teratail.com/questions/358517
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問