teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

いちおう書こうと思っていた回答を追記しておきます

2019/11/27 13:14

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  スライスは元々参照タイプなので通常の関数引数にスライスを渡して値を変更した時、渡し元にも反映されます。
4
4
  ただし、可変長引数でも双方スライスとして渡す場合には参照渡しのような結果になります。
5
- https://play.golang.org/p/xpf1muwMat-
5
+ [https://play.golang.org/p/xpf1muwMat-](https://play.golang.org/p/xpf1muwMat-)
6
6
  ```go
7
7
  package main
8
8
 
@@ -24,6 +24,18 @@
24
24
  ### rows.Scanの使い方
25
25
 
26
26
  rows.Scanの各引数が参照型である必要がありますが、
27
- interface型の参照型という概念はGoにはありません。
27
+ interface型の参照型という概念はGoにはありません。
28
+ interface{}型には「任意型の値の参照」を格納することができます。
28
29
 
30
+ ```go
31
+ rows, _ = db.Query("クエリ")
32
+ for rows.Next() {
33
+ numFields := 10 //実際には構造体のフィールド数を取得します(10は例です)
29
- ちょっと出先なので書きかけです。あとで追記します。
34
+ datas := []interface{}{}
35
+ for i:=0; i<numFields; i++ {
36
+ n := "" //任意の型を初期化
37
+ datas = append(datas, &n) //任意の型の参照をスライスに追加
38
+ }
39
+ rows.Scan(datas...) // 参照渡しな値のスライスを渡す
40
+ }
41
+ ```

2

Scanの使い方(書きかけ)

2019/11/27 13:14

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ### タイトルとGoの仕様としての回答
2
+
1
3
  スライスは元々参照タイプなので通常の関数引数にスライスを渡して値を変更した時、渡し元にも反映されます。
2
4
  ただし、可変長引数でも双方スライスとして渡す場合には参照渡しのような結果になります。
3
5
  https://play.golang.org/p/xpf1muwMat-
@@ -17,4 +19,11 @@
17
19
  f(s...)
18
20
  fmt.Println(s)
19
21
  }
20
- ```
22
+ ```
23
+
24
+ ### rows.Scanの使い方
25
+
26
+ rows.Scanの各引数が参照型である必要がありますが、
27
+ interface型の参照型という概念はGoにはありません。
28
+
29
+ ちょっと出先なので書きかけです。あとで追記します。

1

投稿ミス修正

2019/11/27 09:33

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -1,1 +1,20 @@
1
- スライスは元々参照タイプなのでスライスを渡して値を変更した時、渡し元にも反映されます。
1
+ スライスは元々参照タイプなので通常の関数引数にスライスを渡して値を変更した時、渡し元にも反映されます。
2
+ ただし、可変長引数でも双方スライスとして渡す場合には参照渡しのような結果になります。
3
+ https://play.golang.org/p/xpf1muwMat-
4
+ ```go
5
+ package main
6
+
7
+ import (
8
+ "fmt"
9
+ )
10
+
11
+ func f(s ...string) {
12
+ s[1] = ""
13
+ }
14
+
15
+ func main() {
16
+ s := []string{"a", "b", "c"}
17
+ f(s...)
18
+ fmt.Println(s)
19
+ }
20
+ ```