指针类型
普通类型,变量量存的就是值,也叫值类型。指针类型存的是地址
获取变量量的地址, 用&, 比如: var a int, 获取a的地址:&a
指针类型,变量量存的是一个地址,这个地址存的才是值
获取指针类型所指向的值,使用:*, 比如:var *p int, 使用*p获取p指向的值
package main import( "fmt" ) func test1() { var a int a = 10 fmt.Println(a) var b *int fmt.Printf("%p\n", &b) //指针这个变量的内存地址 fmt.Printf("%p\n", b) //指针的内存地址 fmt.Printf("%p\n", a) //常量 fmt.Printf("%p\n", &a) //常量的内存地址 b = &a //将常量的内存地址指向指针 fmt.Printf("%d\n", *b) *b = 100 //改变指针内存对应的值 fmt.Printf("a=%d\n", a) } func modify(a *int) { *a = 100 } func test2() { var b int = 1 var p *int p = &b modify(p) fmt.Println(b) } func test3() { //p 默认初始化nil //指针的初始化 var p *int var b int p = &b *p = 200 //b = 200 fmt.Printf("%p %p %p\n", p, &b, &p) //指针的初始化 p = new(int) *p = 1000 fmt.Printf("%d\n", *p) fmt.Printf("%p %p %p\n", p, &b, &p) //指针类型的变量初始化:1. 使用其他变量地址给它赋值。 2. 使用new分配。 } func test4(){ var p *string //1. 第一种方式 使用new分配。 p = new(string) *p = "abc" fmt.Println(*p) //2. 第二种方式 使用其他变量地址给它赋值。 var str string = "hello word" p = &str fmt.Println(*p) } func test5(){ //make和new的区别 var a []int a = make([]int, 10) a[0] = 100 fmt.Println(a) var p *[]int p = new([]int) //给指针分配内存地址 (*p) = make([]int, 10) //初始化切片 (*p)[0] = 100 fmt.Println(p) p = &a (*p)[0] = 1000 fmt.Println(a) } func modify_arr(a []int) { fmt.Printf("modify:%p\n", a) a[0] = 100 //改变数据的的值 } func test6() { var a[6]int fmt.Printf("test6:%p\n", &a) modify_arr(a[:]) //切片是引用类型数据 fmt.Println(a) } func main() { //test1() //var a int //test2(&a) //fmt.Println(a) //test3() //test4() //test5() test6() }
内置函数
1、close:主要 用来关闭channel
2、len: 用来求 长度, 比如string、array、slice、map、channel
3、new: 用来分配内存,主要用来分配值类型, 比如int、struct、string。返回的是指针
4、make: 用来分配内存,主要用来分配引 用类型, 比如chan、map、slice
5、append: 用来追加元素到数组、slice中
6、panic和recover: 用来做错误处理理
7、new和make的区别
函数
1、声明语法:func 函数名 (参数列列表) [(返回值列列表)] {}
func add() {
}
func add(a int, b int) {
}
func add(a int, b int) int {
}
func add(a int, b int) (int, int) {
}
func add(a, b int) (int, int) {
}
2、golang函数特点:
不支持重载, 一个包不能有两个名字 一样的函数
函数是一等公 民,函数也是一种类型, 一个函数可以赋值给变量量
匿匿名函数
多返回值
package main import "fmt" func add(a, b int) int { return a + b } func main() { //函数是一等公民,也可以和变量量一样进行行赋值 c := add fmt.Printf("%p %T %p %T\n", c, add, c,add) sum := c(10, 20) fmt.Println(sum) sum = add(10, 20) fmt.Println(sum) }