函数参数的 splats 写法无法识别?

jiyinyiyong · 2013-10-06 13:46:46 · 4147 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-10-06 13:46:46 的主题,其中的信息可能已经有所发展或是发生改变。

新手表示正在看的 PDF https://github.com/mikespook/Learning-Go-zh-cn 里边有 splats... CofeeScript 里的叫法,, 顺带问下 Golang 里这叫啥?

问题是我用了这样的语法, 结果编译过程报错.. 请问这语法在新的 Golang 里是怎么?

我的环境是

➤➤ uname -a
Darwin chentekiMacBook-Air.local 12.4.1 Darwin Kernel Version 12.4.1: Tue May 21 17:04:50 PDT 2013; root:xnu-2050.40.51~1/RELEASE_X86_64 x86_64
➤➤ go version
go version go1.1.2 darwin/amd64


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4147 次点击  
加入收藏 微博
9 回复  |  直到 2013-10-08 11:27:54
polaris
polaris · #1 · 12年之前

变参,也叫不定参数。

你这里的 add 方法并没有接收一个变参,你不能直接将一个变参传递给 add。

可以这么调用:add(arg[0], arg[1])

当然,你需要保证 arg 长度大于1。

jiyinyiyong
jiyinyiyong · #2 · 12年之前

@polaris 书上有这样的例子是那样的啊?

polaris
polaris · #3 · 12年之前

比如:

func Add(args ...int) {}

func Calu(args ...int) {
    // Add(args...) 或者
    Add(args[0], args[1])
}
jiyinyiyong
jiyinyiyong · #4 · 12年之前

@polaris 可我这段代码报错了呀

Add(args...)

这样的代码, 实际上出错, 怀疑是教程有错了..

hooluupog
hooluupog · #5 · 12年之前
jiyinyiyongjiyinyiyong #4 回复

@polaris 可我这段代码报错了呀 Add(args...) 这样的代码, 实际上出错, 怀疑是教程有错了..

书上说的没错,你理解的有偏差。

package main

import "fmt"

func add(arg ...int) int {
    value := 0
    for _, v := range arg {
        value += v
    }
    return value
}
func demo(arg ...int) {
    fmt.Println(add(arg...))
}
func main() {
    demo(1, 2, 3, 4)

}
hooluupog
hooluupog · #6 · 12年之前
package main
import "fmt"

func add(arg ...int) int {
     value := 0
     for _, v := range arg {
         value += v
   }
    return value
}
func demo(arg ...int) {
    fmt.Println(add(arg...))
}

func main() {
    demo(1, 2, 3, 4)
}
jiyinyiyong
jiyinyiyong · #7 · 12年之前
hooluupoghooluupog #6 回复

package main import "fmt" func add(arg ...int) int { value := 0 for _, v := range arg { value += v } return value } func demo(arg ...int) { fmt.Println(add(arg...)) } func main() { demo(1, 2, 3, 4) }

不好意思, 还是没看懂重点

polaris
polaris · #8 · 12年之前

就是不允许一个变参直接传递给一个非变参。你的代码就这么干了。

jiyinyiyong
jiyinyiyong · #9 · 12年之前
polarispolaris #8 回复

就是不允许一个变参直接传递给一个非变参。你的代码就这么干了。

明白了,, 使用变参我的声明没写变参... 动态语言用惯了...

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传