英文:
Count similar array value
问题
我正在尝试学习Go(或Golang),但似乎无法搞定。我有两个文本文件,每个文件都包含一个单词列表。我想要计算同时存在于这两个文件中的单词数量。
以下是我目前的代码:
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() {
// 文本文件的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"
// 创建存储数组
var buffer [2000]string
var bufferUrl1 [40000]string
// 设置一个计数器
var sibling = 0
// 读取并存储文本文件
wordList, err := http.Get(list)
if err != nil {
log.Fatalf("获取URL时出错:%v", err)
}
defer wordList.Body.Close()
wordUrl1, err := http.Get(url1)
if err != nil {
log.Fatalf("获取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;
// 填充数组
for streamList.Scan() {
buffer[i] = streamList.Text()
i++
}
for streamUrl1.Scan() {
bufferUrl1[j] = streamUrl1.Text()
j++
}
// 错误发生在这里:
// 这段代码应该是要将bufferUrl1中的每个值与buffer中的值进行比较,然后增加sibling并输出"FIND"
for v := range bufferUrl1{
if stringInSlice(bufferUrl1, buffer) {
sibling++
fmt.Println("FIND")
}
}
// 为了测试目的,这些行将打印出两个数组的内容
// fmt.Println(buffer)
// fmt.Println(bufferUrl1)
}
但是,现在我的构建甚至无法成功。我只看到以下消息:
.\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
请帮我看看这个问题。
英文:
I'm trying to learn Go (or Golang) and can't seem to get it right. I have 2 texts files, each containing a list of words. I'm trying to count the amount of words that are present in both files.
Here is my code so far :
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)
}
But right now, my build doesn't even succeed. I'm only greeted with this message:
.\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是一个数组:
[4000]string
。你想使用v
(bufferUrl1
中的每个字符串)。但实际上,你想使用第二个变量——第一个变量是索引,在下面的代码中被忽略了,使用了_
代替。 -
[2000]string
类型与[]string
不同。在Go语言中,数组和切片是不同的。请阅读Go Slices: usage and internals。我已经将两个变量声明更改为使用具有相同初始长度的切片。
需要进行的更改以进行编译:
声明:
// 创建存储切片
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 是修复了下面评论中的问题的代码(你将无法从Playground进行HTTP请求)。
英文:
- bufferUrl1 is an array:
[4000]string
. You meant to usev
(each
string inbufferUrl1
). But in fact, you meant to use the second
variable—the first variable is the index which is ignored in the code
below using_
. - type
[2000]string
is different from[]string
. In Go, arrays and slices are not the same. Read Go Slices: usage and internals. I've changed both variable declarations to use slices with the same initial length using make.
These are changes you need to make to compile.
Declarations:
// Create storing slices
buffer := make([]string, 2000)
bufferUrl1 := make([]string, 40000)
and the loop on Line 69:
for _, s := range bufferUrl1 {
if stringInSlice(s, buffer) {
sibling++
fmt.Println("FIND")
}
}
As a side-note, consider using a map instead of a slice for buffer
for more efficient lookup instead of looping through the list in stringInSlice
.
https://play.golang.org/p/UcaSVwYcIw has the fix for the comments below (you won't be able to make HTTP requests from the Playground).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论