Go 重新定义标志-在YouTube数据API 3中按键进行恐慌搜索
我正在尝试通过输入键搜索YouTube视频。我对代码做了一些修改,让它可以通过不同的键进行多次搜索 当我搜索一次就可以了Go 重新定义标志-在YouTube数据API 3中按键进行恐慌搜索,go,youtube-data-api,google-api-go-client,Go,Youtube Data Api,Google Api Go Client,我正在尝试通过输入键搜索YouTube视频。我对代码做了一些修改,让它可以通过不同的键进行多次搜索 当我搜索一次就可以了 func main() { result1, err1 := SearchYoutubeByKey("hello") if err1 != nil { panic(err1) } fmt.Println(result1) // result2, err2 := SearchYoutubeByKey("world")
func main() {
result1, err1 := SearchYoutubeByKey("hello")
if err1 != nil {
panic(err1)
}
fmt.Println(result1)
// result2, err2 := SearchYoutubeByKey("world")
// if err2 != nil {
// panic(err2)
// }
// fmt.Println(result2)
}
但是如果我搜索两次
func main() {
result1, err1 := SearchYoutubeByKey("hello")
if err1 != nil {
panic(err1)
}
fmt.Println(result1)
result2, err2 := SearchYoutubeByKey("world")
if err2 != nil {
panic(err2)
}
fmt.Println(result2)
}
。。。然后它会因为错误消息而惊慌失措
flag redefined: query
。。。在线
query := flag.String("query", str, "Search term")
完整代码:
package main
import (
"code.google.com/p/google-api-go-client/googleapi/transport"
"code.google.com/p/google-api-go-client/youtube/v3"
"flag"
"fmt"
"net/http"
)
var (
maxResults = flag.Int64("max-results", 25, "Max YouTube results")
service *youtube.Service
response *youtube.SearchListResponse
)
const developerKey = "youtube developer key"
type YoutubeSearchResult struct {
Title, YoutubeId string
}
func SearchYoutubeByKey(str string) (result []*YoutubeSearchResult, err error) {
query := flag.String("query", str, "Search term")
flag.Parse()
client := &http.Client{
Transport: &transport.APIKey{Key: developerKey},
}
service, err = youtube.New(client)
if err != nil {
return
}
// Make the API call to YouTube.
call := service.Search.List("id,snippet").
Q(*query).
MaxResults(*maxResults)
response, err = call.Do()
if err != nil {
return
}
// Iterate through each item and add it to the correct list.
for _, item := range response.Items {
switch item.Id.Kind {
case "youtube#video":
result = append(result, &YoutubeSearchResult{Title: item.Snippet.Title, YoutubeId: item.Id.VideoId})
}
}
return
}
func main() {
result1, err1 := SearchYoutubeByKey("hello")
if err1 != nil {
panic(err1)
}
fmt.Println(result1)
result2, err2 := SearchYoutubeByKey("world")
if err2 != nil {
panic(err2)
}
fmt.Println(result2)
}
因此,不可能在网站上使用此代码。只有第一个用户能够第一次搜索,其他用户将失败
我无法在运行时更改标志,但如何在一个程序中通过两个不同的键进行搜索
更新
工作解决方案:
package main
import (
"code.google.com/p/google-api-go-client/googleapi/transport"
"code.google.com/p/google-api-go-client/youtube/v3"
"flag"
"fmt"
"net/http"
)
var (
maxResults = flag.Int64("max-results", 25, "Max YouTube results")
service *youtube.Service
response *youtube.SearchListResponse
query = flag.String("query", "str", "Search term")
)
const developerKey = "youtube api key"
type YoutubeSearchResult struct {
Title, YoutubeId string
}
func SearchYoutubeByKey(str string) (result []*YoutubeSearchResult, err error) {
flag.Parse()
client := &http.Client{
Transport: &transport.APIKey{Key: developerKey},
}
service, err = youtube.New(client)
if err != nil {
return
}
// Make the API call to YouTube.
call := service.Search.List("id,snippet").
Q(str).
MaxResults(*maxResults)
response, err = call.Do()
if err != nil {
return
}
// Iterate through each item and add it to the correct list.
for _, item := range response.Items {
switch item.Id.Kind {
case "youtube#video":
result = append(result, &YoutubeSearchResult{Title: item.Snippet.Title, YoutubeId: item.Id.VideoId})
}
}
return
}
func main() {
result1, err1 := SearchYoutubeByKey("hello")
if err1 != nil {
panic(err1)
}
fmt.Println(result1)
result2, err2 := SearchYoutubeByKey("world")
if err2 != nil {
panic(err2)
}
fmt.Println(result2)
}
恐慌信息会告诉你到底出了什么问题。命令行标志只能定义一次。如果您试图在运行时重新定义它们,它会惊慌失措。我猜到了,如何解决它?如何在搜索过程中按两个不同的键进行搜索runtime@efr首先,为什么要在那里使用
标志
包?从YouTube的例子来看,似乎您只需要将str
直接传递到Q
。从上面的链接:query=flag.String(“query”、“Google”、“Search term”)
-glag用于设置搜索键。如何将str
直接传递到Q
?@efr请阅读及其用途。在您的情况下,您应该省略标志
部分,调用Q(str)
,而不是Q(*query)
。