2016-06-18 27 views
0

整数スライスを整数スライスに追加しようとしています。スライスを印刷すると、期待通りに表示されます。しかし、スライスをスライスのスライスに追加すると、コンテンツが変更されます。整数スライスを整数スライスに追加すると、追加されるスライスが変更されます

package main 

import "fmt" 

var myGraph [8][8]bool //the graph 

var visited [8]bool //an array that marks if visited 

var path []int //a slice to store a possible path 

var paths [][]int 

func dfs(src int, dest int) { 
    //add current node to path 
    path = append(path, src) 

    //mark current node as visited 
    visited[src] = true 

    //if the current node is the destination 
    //print the path and return 
    if src == dest { 
     fmt.Println(path) 
     paths = append(paths, path) //I'm trying to push the path slice into the paths slice 
     return 
    } 

    for i := 1; i <= 7; i++ { //loop through all nodes 

     //if ith node is a neighbour of the current node and it is not visited 
     if myGraph[src][i] && visited[i] == false { 

      // call dfs on the current node 
      dfs(i, dest) 

      //mark the current node as unvisited 
      //so that we can other paths to the final destination 
      visited[i] = false 

      //re-slice the slice - get rid of the current node 
      path = path[:len(path)-1] 
     } 

    } 

} 

func main() { 
    path = make([]int, 0, 8) 
    paths = make([][]int, 0, 10) 

    //creating the graph 
    myGraph[1] = [...]bool{false, false, true, true, false, false, true, false} 
    myGraph[2] = [...]bool{false, true, false, true, false, true, false, false} 
    myGraph[3] = [...]bool{false, true, true, false, true, false, true, false} 
    myGraph[4] = [...]bool{false, false, false, true, false, false, true, false} 
    myGraph[5] = [...]bool{false, false, true, false, false, false, true, false} 
    myGraph[6] = [...]bool{false, true, false, true, true, false, false, true} 
    myGraph[7] = [...]bool{false, false, false, false, false, false, true, false} 

    //call dfs by feeding in the source and the destination 
    dfs(1, 7) 
    fmt.Println(paths) 
} 

Output: 
[1 2 5 6 7] 
[1 3 2 5 6 7] 
[1 3 4 6 7] 
[1 3 6 7] 
[1 6 7] 
[[1 6 7 3 2 5] [1 6 7 3 2] [1 6 7 3 2] [1 6 7 3 2 5] [1 6 7 3 2] [1 6 7 3] [1 6 7]] 

ご覧のとおり、スライススライスの最後にはメイン機能が表示されます。ただし、その内容はdfs()によって出力される個々のスライスとは異なります。

+0

タイトルはピザに飢えていました。 – Paulb

答えて

1

はのは、このコードを少し変更してみましょう:

var myGraph [8][8]bool //the graph 

var visited [8]bool //an array that marks if visited 

var path []int //a slice to store a possible path 

var paths [][]int 

func dfs(src int, dest int) { 
    //add current node to path 
    path = append(path, src) 

    //mark current node as visited 
    visited[src] = true 

    //if the current node is the destination 
    //print the path and return 
    if src == dest { 
     // (A) 
     buffer := make([]int, len(path)) 
     copy(buffer, path) 

     fmt.Println(buffer) 
     paths = append(paths, buffer) //I'm trying to push the path slice into the paths slice 

     // fmt.Println(path) 
     // paths = append(paths, path) //I'm trying to push the path slice into the paths slice 
     return 
    } 

    for i := 1; i <= 7; i++ { //loop through all nodes 

     //if ith node is a neighbour of the current node and it is not visited 
     if myGraph[src][i] && visited[i] == false { 

      // call dfs on the current node 
      dfs(i, dest) 

      //mark the current node as unvisited 
      //so that we can other paths to the final destination 
      visited[i] = false 

      //re-slice the slice - get rid of the current node 
      path = path[:len(path)-1] 
     } 

    } 

} 

func main1() { 
    // path = make([]int, 0, 8) 
    // paths = make([][]int, 0, 10) 

    //creating the graph 
    myGraph[1] = [...]bool{false, false, true, true, false, false, true, false} 
    myGraph[2] = [...]bool{false, true, false, true, false, true, false, false} 
    myGraph[3] = [...]bool{false, true, true, false, true, false, true, false} 
    myGraph[4] = [...]bool{false, false, false, true, false, false, true, false} 
    myGraph[5] = [...]bool{false, false, true, false, false, false, true, false} 
    myGraph[6] = [...]bool{false, true, false, true, true, false, false, true} 
    myGraph[7] = [...]bool{false, false, false, false, false, false, true, false} 

    //call dfs by feeding in the source and the destination 
    dfs(1, 7) 
    fmt.Println(paths) 
} 

そして予想通り、今では動作します!どうして?スライスは参照型であるため、値型ではありません。 pathを後で変更すると、// (A)で行われたようなスナップショットを取らない限り、新しい値が表示されます。

+0

ありがとうございます。そして、私はfmtを推測しています.Printlnは、それが「スナップショット」の一種でもあるため、私に期待される結果を与えていました。 – Ruzaik

+0

私は新しくて、このプロジェクトを強化することが可能かどうか疑問に思っていました。私はグラフ、srcとdestを取り、パスのスライスを吐き出す関数を書こうとしています。しかし、今私はグローバル変数を利用しています。私は入れ子関数を使ってそれをやろうとしていましたが、Goはそれを許さないようです。何かアドバイス? – Ruzaik

+0

1 - Underling; fmt.Printlnはその引数をチャンネルに送ります。実際に議論を評価する時に、それらは変更されます - この場合、それらは参照型であるためです。 –

関連する問題