go对参数的处理偏向保守:

func test(p **int)  { // 整型指针的地址
    x := 100  // 变量x 为100
    *p = &x  // 整型指针指向x的地址
​
}
​
func main()  {
    var p *int
    test(&p)
    fmt.Println(*p)
}

type serverOption struct {
    address string
    port int
    path string
    timeout time.Duration
    log *log2.Logger
}
​
func newOption() *serverOption {
    return &serverOption{
        address: "0.0.0.0",
        port:    8080,
        path:    "/func/test",
        timeout: time.Second * 5,
        log:     nil,
    }
}
​
func server(option *serverOption)  {}
​
func main()  {
    opt := newOption()
    opt.port = 8085
    server(opt)
}

变参:

func test(s string, a ...int)  {
    fmt.Printf("%T, %v\n", a, a)
}
​
func main()  {
    test("abc", 1,2,3,4,5)
}
func test(s string, a ...int)  {
    fmt.Printf("%T, %v\n", a, a)
}
​
func main()  {
    s := [5]int{1,2,3,4,5}
    test("abc", s[:]...)
}
func test( a ...int)  {
    for i := range a{
        a[i] += 200
    }
}
​
func main()  {
    a := []int{1, 2, 3, 4}
    test(a...)
    fmt.Println(a)
}

 

知识补充:

  • 形参,实参,可选参数,命名实参,传出参数区别