読者です 読者をやめる 読者になる 読者になる

DRYな備忘録

Don't Repeat Yourself.

Go言語でスライスの参照と参照のスライスについてメモ【golang】【slice】

たんなるメモです

Go言語のスライス

Go言語にはもちろん配列もあるけれど、スライスというのがある。めっちゃ乱暴にいうと可変長配列。むずかしいことはわかりません。参考になるのはこれです。

参照のスライスがつくれる

配列同様、任意の型のスライスがつくれる。もちろん参照も。

var users []*User

[https://twitter.com/otiai10/status/479602702469439488:embed#ん?Someはあるけど、Someはあるのか?]

スライスの参照と参照のスライスは違うのか

http://play.golang.org/p/GlGnXZtkdp

package main

import "fmt"
import "reflect"

type Some struct {}

func main() {
    var sl []*Some
    sl = append(sl, &Some{})
 
    fmt.Printf("%T, %+v\n", sl, sl)
 
    var sl2 *[]Some
    sl2 = &[]Some{Some{}}
 
    fmt.Printf("%T, %+v\n", sl2, sl)
 
    // fmt.Println((sl == sl2))
    // invalid operation: sl == sl2 (mismatched types []*Some and *[]Some)
 
    fmt.Println(reflect.DeepEqual(sl, sl2))
 
    sl2_ := *sl2
    fmt.Println((sl[0] == &sl2_[0]))
    fmt.Println((*sl[0] == sl2_[0]))
}

そのけっか

[]*main.Some, [0x1beed0]
*[]main.Some, [0x1beed0]
false
true
true

まあ、reflect.DeepEqualは配列やスライス、オブジェクトなどを再帰的に比較するだけなので、falseになるのはわかる。

最後の2行は、右辺の値型のものの参照(&)にしたり、左辺の参照型のものを値に(*)したりしてる。

要素の指してる場所はいっしょだと思っていいのかな

f:id:otiai10:20140619215919j:plain

DRYな備忘録