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]
*/

浙公网安备 33010602011771号