//定义一个无参无返回值的函数funcsss(){
fmt.Println("今天小仙女超级超级开心呀!")}//定义一个有参无返回值的函数funcaaa(a string, b, c int, d float64){
fmt.Printf("姓名:%s\n年龄:%d\n开心指数;%d\n爆表指数:%f\n", a, b, c, d)}//定义一个不定参数的函数funcbbb(g ...int){//输出不定参数的长度
fmt.Println("len(g)=",len(g))//输出不定参数for i :=0; i <=len(g)-1; i++{
fmt.Printf("g[%d]=%d\n", i, g[i])}//使用foreach语句遍历输出各元素for i, j :=range g {
fmt.Printf("g[%d]=%d\n", i, j)}}
//定义一个无参有返回值的函数funcggg()(int,int,int){//返回值无名字return1,2,3}funchhh()(d string, e string, f string){//定义返回值的名字
d ="小仙女今天没有课哈哈!"
e ="小仙女今天中午吃饭啦!"
f ="小仙女今天中午睡午觉啦!"return}+//定义一个有参有返回值的函数//max min 是返回值名称,其顺序和返回值顺序一样//g h 是形参funciii(g, h int)(max, min int){if g > h {
max = g
min = h
}else{
max = h
min = g
}return}
不定参数的传递
//不定参数传递//参数的全部传递funcddd(s ...string){//将ddd全部参数传递给cccccc(s...)}funcccc(s ...string){//输出参数长度
fmt.Println("len(s)=",len(s))//输出不定参数for i :=0; i <=len(s)-1; i++{
fmt.Printf("s[%d]=%s\n", i, s[i])}//用foreach语句遍历输出各元素for i, j :=range s {
fmt.Printf("s[%d]=%s\n", i, j)}}//参数的部分传递funceee(h ...string){//将eee不定参数的前几位传递过去给ffffff(h[:2]...)//传递h[0]~h[2](不包括h[2])//将不定参数的后面几位传递过去fff(h[2:]...)//传递h[2]之后的全部参数(包括h[2])}funcfff(h ...string){//输出参数长度
fmt.Println("len(h)=",len(h))//用foreach语句遍历输出各元素for i, j :=range h {
fmt.Printf("h[%d]=%s\n", i, j)}}
2、函数类型
递归函数
package main
import("fmt")//实现1到100的求和funcC(){var sum intfor i :=1; i <=100; i++{
sum += i
}
fmt.Printf("sum=%d\n", sum)}//递归函数求1到100的和funcA(i int)int{if i ==100{return100}return i +A(i+1)}funcB(i int)int{if i ==1{return1}return i +B(i-1)}//Fibonacci数列funcD(i int)int{if i ==1|| i ==2{return i -1}returnD(i-1)+D(i-2)}funcmain(){
sum :=A(1)
fmt.Println(sum)
sum =B(100)
fmt.Printf("sum=%d\n", sum)C()
fmt.Println("*****************************************")var h int
fmt.Printf("请输入一个正整数:")
fmt.Scan(&h)
result :=D(h)
fmt.Printf("result=%d\n", result)}
回调函数
//函数也是一种数据类型,通过type给一个函数类型起名//没有函数名字,没有{}type FuncType func(int,int)int//实现求和funcsum(a,b int)int{return a+b
}//回调函数 函数有一个参数是函数类型funcaaa(a,b int, c FuncType)int{returnc(a,b)}funcmain(){
e :=aaa(7,9,sum)
fmt.Println("result=",e)}package main
import("fmt")type FuncType func(int,int)int//类型别名// type long int// type char byte//返回值没有定义名称,return后直接写返回的表达式funcX(a int, b int)int{return a + b
}funcY(a, b int)int{return a - b
}funcZ(a, b int)int{return a * b
}funcmain(){var s FuncType
s = X
g :=s(1,2)
fmt.Printf("result=%d\n", g)
s = Y
g =s(1,2)
fmt.Printf("result=%d\n", g)
s = Z
g =s(1,2)
fmt.Printf("result=%d\n", g)
fmt.Println("------------------------------------")
g =qqq(2,3,4, a)
fmt.Printf("result=%d\n", g)
g =qqq(2,3,4, b)
fmt.Printf("result=%d\n", g)
g =qqq(2,3,4, c)
fmt.Printf("result=%d\n", g)}//回调函数type hhh func(int,int,int)intfuncqqq(x int, y int, z int, m hhh)int{
fmt.Println("@@@@")returnm(x, y, z)}funca(x int, y int, z int)int{return x * y * z
}funcb(x int, y int, z int)int{return x + y + z
}funcc(x int, y int, z int)int{return x*y + z
}
匿名函数
package main
import("fmt")funcmain(){
a :=7
str :="小仙女"func(){
a =9
str ="嘿嘿嘿"
fmt.Println(a,str)}()
fmt.Println(a,str)//匿名函数,没有函数名字//用变量f1接收函数
f1 :=func(){
fmt.Printf("a=%d\nstr=%s\n",a,str)}f1()//函数的调用//给函数起一个别名(sss)然后调用type sss func()//声明一个函数类型的变量f2var f2 sss
//将f1赋值给f2
f2 = f1
//调用函数f2()//定义匿名函数,同时调用func(){
fmt.Printf("a=%d\nstr=%s\n",a,str)}()//()代表调用此匿名函数//函数必须调用 否则报错 或者可以找变量接收 如f1//带参数的匿名函数
f3 :=func(i, j int){
fmt.Printf("result = %d\n",i+j)}f3(10,20)func(i,j int){
fmt.Printf("result = %d\n",i*j)}(10,20)//带参数有返回值的匿名函数
c,d:=func(m,n int)(max,min int){if m>n{
max = m
min = n
}else{
max = n
min = m
}return}(10,20)
fmt.Println(c,d)
f4:=func(x,y string)string{
fmt.Println(x,y)return x+y
}f4("可可爱爱","开开心心")//给函数起一个别名并调用type ggg func(string,string)stringvar f5 ggg
f5 = f4
f5("阳光很暖","微风正好")}
3、defer的用法(先入后出)
funcmain(){
a :=10
b :=20deferfunc(){
fmt.Println(a,b)//a=7 b=9}()
a =7
b =9
fmt.Println(a,b)
x :=2
y :=3deferfunc(x,y int){
fmt.Println(x,y)//x=2 y=3 参数先传过 然后等待执行}(x,y)
x =5
y =6
fmt.Println(x,y)}
4、闭包与匿名函数
package main
import"fmt"funcmain(){
fmt.Println(aaa())//1
fmt.Println(aaa())//1
fmt.Println(aaa())//1// 将调用bbb()返回的函数赋给变量f
f :=bbb()//调用返回的函数
fmt.Println(f())//1
fmt.Println(f())//4
fmt.Println(f())//9//直接一次性调用bbb()和返回的函数
fmt.Println((bbb())())//1
fmt.Println((bbb())())//1
fmt.Println((bbb())())//1}funcaaa()int{//函数被调用时 x才分配空间 初始化为0var x int//没有初始化 值为0
x++return x*x //函数调用完毕 x 自动释放}//返回值为一个匿名函数[fnuc() int] 返回一个函数类型funcbbb()func()int{var x int
i:=func()int{
x++return x*x
}return i
}
二、指针变量
package main
import"fmt"funcmain(){var a int=123
fmt.Printf("a = %d\n",a)//变量的内存
fmt.Printf("&a = %v\n",&a)//变量的地址//保存某个变量的地址 需要指针类型 *int 保存 int 的地址, **int 保存 *int 的地址//定义一个变量p 类型为*intvar p *int// 指针变量指向谁 就把谁的地址赋给变量
p =&a
fmt.Printf("p = %v,a &a = %v\n",p,&a)//*p操作的不是p的内存 是p指向的内存 即a*p =111//a=111
fmt.Printf("*p = %v,a = %v\n",*p,a)
fmt.Println("****************************************8")
x,y:=10,20//变量本身传递,即值传递swap1(x,y)
fmt.Printf("x = %d , y = %d\n",x,y)//变量地址传递,即址传递swap2(&x,&y)
fmt.Printf("x = %d , y = %d\n",x,y)}funcswap1(x,y int){
x,y = y,x
fmt.Printf("x = %d , y = %d\n",x,y)}funcswap2(p1,p2 *int){*p1,*p2=*p2,*p1
}
package main
import("fmt")funcmain(){//顺序初始化 必须每个成员都初始化 否则报错var s1 Student = Student{"hhh",3,1,12345,"北京"}
fmt.Println("s1 = ",s1)//指定成员初始化 未初始化的成员自动赋值为0
s2 := Student{name:"hhh",addr:"北京"}
fmt.Println("s2 = ",s2)//指针var p1 *Student =&Student{"hhh",3,1,12345,"北京"}
fmt.Println("*p1 = ",*p1)
p2 :=&Student{name:"hhh",addr:"北京"}
fmt.Println("*p2 = ",*p2)//单独操作构体变量var s Student
//s := new (Student) 用new为s分配一片空间
s.name ="hhh"
s.age =3
s.sex =1
s.id =12345
s.addr ="北京"
fmt.Println("s = ",s)//指针有合法指向后 才能操作成员var g Student
var p3 *Student
p3 =&g
p3.name ="hhh"(*p1).age =3
p3.sex =1
p3.id =12345
p3.addr ="北京"
fmt.Println("*p3 = ",*p3)//结构体比较
a1 := Student{"hhh",3,1,12345,"北京"}
a2 := Student{"hhh",3,1,12345,"北京"}
a3 := Student{"hhh",7,1,12345,"北京"}
fmt.Println("a1==a2",a1==a2)
fmt.Println("a1==a3",a1==a3)//同类型的结构体可以相互赋值var a4 Student
a4 = a3
fmt.Println("a4 = ",a4)//函数作为参数的传递test01(a4)//值传递
fmt.Println("a4 = ",a4)// 拷贝一份儿过去 故原来的值不改变test02(&a4)//地址传递
fmt.Println("a4 = ",a4)//创建一个指针指向原来的地址 故值会改变}//定义一个结构体类型 存放学生变量type Student struct{
name string
age int
sex int
id int
addr string}functest01(s Student){
s.name ="ggg"
fmt.Println("s = ",s)}functest02(p *Student){
p.name ="kkk"}
1、结构体中指针的应用
package main
import("fmt")funcmain(){//g := Student{Person{"hhh",3,1},12345,"beijing"}}//fmt.Println("g = ",g)//定义一个变量var x long =2// long为int的别名//变量名.方法名(参数)
result := x.add(3)
fmt.Println("result = ",result)}type Person struct{
name string
age int
sex int}type Student struct{
Person
id int
addr string}//类型别名type long int//方法func(a long)add(b long)long{//(a = 2 b = 3)return a+b
}
2、匿名字段
package main
import"fmt"funcmain(){//顺序初始化var s1 Student = Student{Person{"hhh",3,1,},12345,"北京"}
fmt.Println("s1 = ",s1)//自动推导类型
s2 := Student{Person{"hhh",3,1,},12345,"北京"}
fmt.Printf("s2 = %+v\n",s2)//%+v 使输出的s2更详细//指定成员初始化 没有初始化的自动赋值为0
s3 := Student{Person:Person{name:"ggg"},addr:"上海"}
fmt.Printf("s3 = %+v\n",s3)}type Person struct{
name string
age int
sex int}type Student struct{
Person //只有类型 没有名字 匿名字段 继承了Person的成员
id int
addr string}