2016-04-10 4 views
0

私はGo(またはGolang)を学びたいと思っています。私は2つのテキストファイルを持っていて、それぞれに単語のリストが入っています。私は両方のファイルに存在する単語の数を数えようとしています。類似の配列値を返します

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
    "bufio" 
) 

func stringInSlice(str string, list []string) bool { 
    for _, v := range list { 
     if v == str { 
      return true 
     } 
    } 
    return false 
} 

func main() { 
    // Texts URL 
    var list = "https://gist.githubusercontent.com/alexcesaro/c9c47c638252e21bd82c/raw/bd031237a56ae6691145b4df5617c385dffe930d/list.txt" 
    var url1 = "https://gist.githubusercontent.com/alexcesaro/4ebfa5a9548d053dddb2/raw/abb8525774b63f342e5173d1af89e47a7a39cd2d/file1.txt" 

    //Create storing arrays 
    var buffer [2000]string 
    var bufferUrl1 [40000]string 

    // Set a sibling counter 
    var sibling = 0 

    // Read and store text files 
    wordList, err := http.Get(list) 
    if err != nil { 
     log.Fatalf("Error while getting the url : %v", err) 
    } 
    defer wordList.Body.Close() 

    wordUrl1, err := http.Get(url1) 
    if err != nil { 
     log.Fatalf("Error while getting the url : %v", err) 
    } 
    defer wordUrl1.Body.Close() 

    streamList := bufio.NewScanner(wordList.Body) 
    streamUrl1 := bufio.NewScanner(wordUrl1.Body) 

    streamList.Split(bufio.ScanLines) 
    streamUrl1.Split(bufio.ScanLines) 

    var i = 0; 
    var j = 0; 

    //Fill arrays with each lines 
    for streamList.Scan() { 
     buffer[i] = streamList.Text() 
     i++ 
    } 
    for streamUrl1.Scan() { 
     bufferUrl1[j] = streamUrl1.Text() 
     j++ 
    } 

    //ERROR OCCURRING HERE : 
    // This code if i'm not wrong is supposed to compare through all the range of bufferUrl1 -> bufferUrl1 values with buffer values, then increment sibling and output FIND 
    for v := range bufferUrl1{ 
     if stringInSlice(bufferUrl1, buffer) { 
      sibling++ 
      fmt.Println("FIND") 
     } 
    } 

    // As a testing purpose thoses lines properly paste both array 
    // fmt.Println(buffer) 
    // fmt.Println(bufferUrl1) 

} 

しかし、今、私のビルドはしても成功しない:ここでは

は、これまでの私のコードです。私は、このメッセージで迎えています:[4000]string

.\hello.go:69: cannot use bufferUrl1 (type [40000]string) as type string in argument to stringInSlice 
.\hello.go:69: cannot use buffer (type [2000]string) as type []string in argument to stringInSlice 

答えて

1
  1. bufferUrl1は配列です。 v(それぞれ 文字列、bufferUrl1)を使用することを意味します。しかし実際には、第2の変数 を使用することを意味しました。最初の変数は、コード で無視されるインデックスで、_を使用しています。
  2. タイプ[2000]stringは、[]stringとは異なります。 Goでは、配列とスライスが同じではありません。 Go Slices: usage and internalsを読んでください。 makeを使って同じ初期長さのスライスを使用するように両方の変数宣言を変更しました。

これは、コンパイルするために必要な変更です。

宣言:

// Create storing slices 
buffer := make([]string, 2000) 
bufferUrl1 := make([]string, 40000) 

とライン69上のループ:サイドノートとして

for _, s := range bufferUrl1 { 
    if stringInSlice(s, buffer) { 
     sibling++ 
     fmt.Println("FIND") 
    } 
} 

、マップの代わりに、より効率的な検索のためbuffer用のスライスの代わりに、ループを使用することを検討してくださいstringInSliceのリストを参照してください。

https://play.golang.org/p/UcaSVwYcIwには以下のコメントの修正が含まれています(プレイグランドからHTTPリクエストを送信することはできません)。

+0

これはコンパイルエラーを修正しましたが、現在の兄弟結果は本当に奇妙です。ファイルには20268個の類似した単語があります。これは1000ワードのファイルと比較して20000語だけです。OO – Nirnae

+0

スライスは初期化されているので2000と40000の長さになると、範囲ループはそれらをすべて反復処理します。空の文字列を無視するか、長さが0の両方のスライスを作成して追加します。 – nishanths

+0

修正:https://play.golang.org/p/UcaSVwYcIw – nishanths

関連する問題