我是一个 Golang 新手,但我认为我已经掌握了指针和引用的要点,但显然不是:
我有一个必须返回 []github.Repository 的方法,这是来自 Github 客户端的类型。
API 调用返回分页结果,因此我必须循环直到没有更多结果,并将每次调用的结果添加到 allRepos 变量,然后返回 that。到目前为止,这是我所拥有的:
func (s *inmemService) GetWatchedRepos(ctx context.Context, username string) ([]github.Repository, error) {
s.mtx.RLock()
defer s.mtx.RUnlock()
opt := &github.ListOptions{PerPage: 20}
var allRepos []github.Repository
for {
// repos is of type *[]github.Repository
repos, resp, err := s.ghClient.Activity.ListWatched(ctx, "", opt)
if err != nil {
return []github.Repository{}, err
}
// ERROR: Cannot use repos (type []*github.Repository) as type github.Repository
// but dereferencing it doesn't work, either
allRepos = append(allRepos, repos...)
if resp.NextPage == 0 {
break
}
opt.Page = resp.NextPage
}
return allRepos, nil
}
我的问题:如何附加每次调用的结果并返回 []github.Repository 类型的结果?
另外,为什么取消引用在这里不起作用?我尝试用 allRepos = append(allRepos, *(repos)...) 替换 allRepos = append(allRepos, repos...) 但我收到此错误留言:
Invalid indirect of (repos) (type []*github.Repository)
最佳答案
嗯,这里有些地方不对:
您在评论中说“repos 的类型为 *[]github.Repository”,但编译器的错误消息表明 repos 的类型为 []*Repository “。编译器永远不会(除非有错误)出错。
请注意,*[]github.Repository 和 []*Repository 是完全不同的类型,尤其是第二种不是存储库和您不能(真的,没有 方式)在append() 期间取消引用这些指针:您有编写一个循环并取消引用每个 slice 项目并逐一追加。
奇怪的是:github.Repository 和Repository 似乎是两种不同的类型,一种来自包github,另一种来自当前包。同样,您也必须弄清楚这一点。
请注意,Go 中没有 引用。立即停止考虑这些:这是来自其他语言的概念,在 Go 中没有帮助(因为不存在)。
关于pointers - 戈朗 : How to append pointer to slice to slice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42900701/
是否可以从控制台中的书签或代码片段访问$0DOM元素指针?关于$0的更多信息https://developers.google.com/chrome-developer-tools/docs/commandline-api#0_-_4DevToolsremembersthelastfiveDOMelements(orJavaScriptheapobjects)thatyou'veselectedinthetab(orProfilespanel).Itmakesthoseobjectsavailableas$0,$1,$2,$3,and$4.$0returnsthemostrecentl
这是我的代码段。我正在使用iscroll4在触摸设备和桌面上滚动。$('#next_item').bind('mousedowntouchstart',function(e){//dosomethingonclick$(this).bind('mousemovetouchmove',function(e){//triggersonlywhenidragoveritdragstart=true;$(this).css('pointer-events','none');myScroll._start(myDown);return;});});$('#next_item').bind('mo
我正在构建一些测试代码并尝试将指针与进行比较,>运营商。我的目标是将元素排序成一个平衡的树结构(由我实现)。为此,我需要快速、通用的比较。遵循良好的旧C/C++习惯,我目前的想法是(...在撰写本文时)通过指针地址比较它们。但是,正如我所发现的,它不起作用。来源if(&(a.val)给出编译错误./pointer.go:40:invalidoperation:&a.vala和b是val的结构作为(安全的)指针成员。是否可以在go中比较安全指针?怎么办?是否保证指针的顺序保持不变?(例如,我可以想象一些GC技巧也会对数据进行重新排序。) 最佳答案
如果我有主要功能:vara="foo"modify(a)fmt.Println(a)在哪里funcmodify(sstring)error{s="bar"}结果是"foo"还是"bar"? 最佳答案 没有。它不会编译,因为'foo'和'bar'都不是单个字符。但是假设您改用双引号。在Golang中,参数是按值传递的(它们被复制到内存中的新位置-堆栈或堆),无论是私有(private)方法还是公共(public)方法或任意函数都无关紧要。新实例已修改。您的示例的结果将是"foo"。为了修改位于函数外部的变量,您必须显式传递指向此类变量
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭3年前。Improvethisquestion告诉我如何使用Golang登录网站。下载xls文件是得到了,但是为了在Excel表格中有数据,需要登录网站。该站点位于公司的服务器上。如果你能告诉你怎么做。例如,我用来执行此操作的VBA代码。SetoFields=CreateObject("Scripting.Dictionary")WithoFields.Add"login","sdiscor".Add"password","sdiscor"EndWi
我在包级别使用指针变量:varconfig*configuration但尝试解码到变量中会导致此错误:json:Unmarshal(nil*main.configuration)。但是,解码为指向指针变量的指针是成功的。这是什么原因? 最佳答案 Whyisunmarshalingintoapointervariablenotpossible?这是可能的。事实上,这是必需的。解码为非指针是不可能的。json:Unmarshal(nil*main.configuration)这个错误并不是说你不能解码到一个指针,而是说你不能解码到一个n
下面是我查询的代码:我有一个单维数组a当我打印a[0][0]时,我不明白为什么它返回字符a的ascii值:packagemainimport("fmt")funcmain(){a:=[3]string{"a","b","c"}fmt.Println(a[0][0])}输出:97 最佳答案 下面是如何打印ascii的代码示例a:=[3]string{"a","b","c"}for_,rune:=rangea{fmt.Println(rune)//Itwillprinta,b,c}因为你在你的代码中使用了[0][0],所以它是等价的fo
我想守护我的应用程序,但我有一个大问题。我使用的channel是chanstruct{}类型。但是,对于包getopt(标志包),我的标志是*bool类型,所以我不知道如何修改我的应用程序。bool类型的channel还不够。我确定有一个我不明白的概念。我附上代码:packagemainimport("os""syscall""time""github.com/pborman/getopt/v2""github.com/sevlyar/go-daemon")var(done=make(chanstruct{})optQuit=make(chanstruct{})optRun=make(
import"fmt"funczeroptr(ptr*int){*ptr=0}funcmain(){oneptr*int*ptr=1fmt.Println("ptris:",*ptr)zeroptr(ptr)fmt.Println("aftercallingzeroptr,thevalueofptris:",*ptr)}这不起作用,我正在寻找如下输出:ptr是:1调用zeroptr后,ptr的值为:0 最佳答案 您应该使用传递一个&int给zeroptr,如thisexample:packagemainimport"fmt"func
我正在用Go创建一个内存池。我这样做是因为将int隐式转换为interface{}会触发内存分配。我想避免分配。我想在一个池中分配几种类型的指针。游泳池是这样的。typecreatorstruct{buf[]interface{}}func(cr*creator)Create()*interface{}{iflen(cr.buf)==0{cr.buf=make([]interface{},256)}current:=&cr.buf[0]cr.buf=cr.buf[1:]returncurrent}func(cr*creator)CreateInt()*int{pointer:=cr.C