go语言笔记0
函数只能判断是否为nil,不支持比较。
不管是指针,引用类型还是其他类型参数,都是值拷贝传递。在函数调用前,会为形参和返回值分配内存空间,并将实参拷贝到形参内存。
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func test(x *int){ 8 fmt.Printf("Pointer: %p, target: %v\n", &x, x) 9 } 10 11 func main() { 12 a := 0x100 13 p := &a 14 fmt.Printf("Pointer: %p, target: %v\n", &p, p) 15 test(p) 16 }
尽管实参和形参指向同一目标,但传递指针时依然被复制。
二级指针可实现返回值,代码如下
1 package main 2 3 func test(p **int) { 4 x := 100 5 *p = &x 6 } 7 8 func main(){ 9 var p *int 10 test(&p) 11 println(*p) 12 }
如果参数过多,建议将其重构成一个复合结构类型
1 package main 2 3 import ( 4 "time" 5 "log" 6 ) 7 type serverOption struct { 8 address string 9 port int 10 path string 11 timeout time.Duration 12 log *log.Logger 13 } 14 15 func newOption() *serverOption { 16 return &serverOption {//默认参数 17 address: "0.0.0.0", 18 port: 8080, 19 path: "/var/test", 20 timeout: time.Second * 5, 21 log: nil, 22 } 23 } 24 25 func server(option *serverOption){} 26 27 func main() { 28 opt := newOption() 29 opt.port = 8085 30 server(opt) 31 }
变参相关
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func test(s string, a ...int) { 8 fmt.Printf("%T, %v\n", a, a) 9 } 10 11 func main(){ 12 test("abc", 1,2,3,4) 13 }
变参本质是一个切片,如果是数组时,要先转换为且切片
package main import ( "fmt" ) func test(a ...int) { fmt.Println(a) } func main() { a := [3]int{10,20,30} test(a[:]...) }
匿名函数
func(data int) { fmt.Println("hello", data) }(100)
注意第3行}
后的(100)
,表示对匿名函数进行调用,传递参数为 100。
package main import ( "fmt" ) func test(a ...int) { for i := range a { a[i] += 100 } } func main(){ a := []int{10,20,30} test(a...) fmt.Println(a) }
Go 中的数组是值类型而不是引用类型。这意味着当数组赋值给一个新的变量时,该变量会得到一个原始数组的一个副本。如果对新变量进行更改,则不会影响原始数组。
package main import "fmt" func main() { a := [...]string{"USA", "China", "India", "Germany", "France"} b := a // a copy of a is assigned to b b[0] = "Singapore" fmt.Println("a is ", a) fmt.Println("b is ", b) } /* a is [USA China India Germany France] b is [Singapore China India Germany France] */
同样,当数组作为参数传递给函数时,它们是按值传递,而原始数组保持不变。
当切片传递给函数时,即使它通过值传递,指针变量也将引用相同的底层数组。因此,当切片作为参数传递给函数时,函数内所做的更改也会在函数外可见。
package main import ( "fmt" ) func subtactOne(numbers []int) { for i := range numbers { numbers[i] -= 2 } } func main() { nos := []int{8, 7, 6} fmt.Println("slice before function call", nos) subtactOne(nos) // function modifies the slice fmt.Println("slice after function call", nos) // modifications are visible outside } /* array before function call [8 7 6] array after function call [6 5 4] */