Are channels passed by reference implicitly

前端 未结 4 1934
粉色の甜心
粉色の甜心 2021-01-30 06:52

The go tour has this example for channels: https://tour.golang.org/concurrency/2

package main

import \"fmt\"

func sum(a []int, c chan int) {
    sum := 0
    f         


        
4条回答
  •  孤独总比滥情好
    2021-01-30 07:13

    Technically they're copied, because when you use make, you are allocating something on the heap, so it's technically a pointer behind the scenes. But the pointer type is not exposed, so they can be thought of as a reference type.

    EDIT: From the spec:

    The built-in function make takes a type T, which must be a slice, map or channel type, optionally followed by a type-specific list of expressions. It returns a value of type T (not *T). The memory is initialized as described in the section on initial values.

    A channel must be initialized before it can be used. Make does this, so it can be used as a reference type.

    What this basically means is that you can pass it into a function and write to or read from it. The general rule of thumb is if you use make, new or &, you can pass it to another function without copying the underlying data.

    So, the following are "reference" types:

    • slices
    • maps
    • channels
    • pointers
    • functions

    Only data types (numbers, bools and structs, etc) are copied when passing into a function. Strings are special, because they're immutable, but not passed by value. This means that the following won't work as expected:

    type A struct {
        b int
    }
    func f(a A) {
        a.b = 3
    }
    func main() {
        s := A{}
        f(s)
        println(s.b) // prints 0
    }
    

提交回复
热议问题