兵长:胖sir,咋还在看基础知识嘞?你以前可不是这样的哦
胖sir:切,我今天看的和之前的可不一样
兵长:有啥不一样的,你能给我说出花来嘛
胖sir:小样,你自己好好看看
兵长:看看就看看
GO基础知识分享2
1、 多重赋值
交换2个数字的值
i := 10 j := 20 i , j = j, i
2、复数
t := 3 + 5i fmt.Println(t) //(3+5i) fmt.Printf("type == %T", t)//type == complex128
3、输入
var tmp int fmt.Scanf("%d", &tmp) fmt.Println("tmp == ", tmp) //tmp == 1 var tmp2 int fmt.Scan(&tmp2) fmt.Printf("type == %T", tmp2)//type == int
4、类型转换
bool类型不能与int类型互相转化
5、type 自定义类型
type long int64 var a long a = 2 fmt.Printf("type == %T", a) //type == main.long
6、switch
case后面不需要写break; 默认就有该功能
num := 2 switch num { case 1: fmt.Println("111") case 2: fmt.Println("222") //222 case 3: fmt.Println("333") case 4: fmt.Println("4444") }
fallthrough – 不跳出switch语句,后面无条件执行
num := 2 switch num { case 1: fmt.Println("111") case 2: fmt.Println("222") //222 fallthrough case 3: fmt.Println("333") // 333 case 4: fmt.Println("4444") }
switch 后面可以不用写 条件,case 后面可以写条件
score := 90 switch { //这里可以不用写 条件 case score > 90: //case 后面可以写条件 fmt.Println("extent") case score > 80: fmt.Println("good") case score > 70: fmt.Println("not bad") }
7、goto 的写法和功能与C语言保持一致
8、golang函数名字首字母小写,为私有,大写为公有
9、不定参数类型和传递
func getname(args ...string) { length := len(args) if length > 0 { for i, data := range args { fmt.Printf("%d -- %s\n", i, data) } } } func test(args ...string) { getname(args[1:]...) //只传递不定参数中的其中几个 } func main() { test("qqq", "yyy", "bbb") //0 -- yyy //1 -- bbb }
10、函数类型
可以设置函数类型
func Add(a, b int) int { return a + b } type Universal func(int, int) int func main() { var uni Universal uni = Add res := uni(1, 2) fmt.Println(res) }
11 、回调函数
通过回调函数实现多态
func Add(a, b int) int { return a + b } type Universal func(int, int) int func cal(uni Universal, a int, b int) int { return uni(a, b) } func main() { uni := Add res := cal(uni, 1, 2) fmt.Println(res) }
12、匿名函数和闭包
golang中,所有的匿名函数都是闭包
1、匿名函数
2、定义匿名函数的时候直接调用
3、定义匿名函数有参数有返回值
name := "qqq" age := 24 //1、匿名函数 f1 := func() { fmt.Printf("name == %s\n", name) fmt.Printf("age == %d\n", age) } f1() //2、定义匿名函数的时候直接调用 func(hobby string) { fmt.Println(name) fmt.Println(hobby) }("basketball") //3、定义匿名函数有参数有返回值 f3 := func(a, b int) int { return a + b } fmt.Println(f3(1, 3)) res := func(a, b int) int { return a + b }(3, 8) fmt.Println(res)
闭包的特点
1、闭包的特点1,可以捕获变量,且是以引用的方式捕获的
2、必要的特点2 ,闭包里面使用的变量,只要闭包还在使用,则一直有效,哪怕超出该变量的作用域
func cal() func() int { var x int return func() int { x++ return x * x } } func main() { //1、闭包的特点1,可以捕获变量,且是以引用的方式捕获的 a := 1 name := "go" func() { a = 2 name = "hello wrold" fmt.Printf("内部 : a == %d, name == %s\n", a, name) }() fmt.Printf("外部 : a == %d, name == %s\n", a, name) //2、必要的特点2 ,闭包里面使用的变量,只要闭包还在使用,则一直有效,哪怕超出该变量的作用域 f := cal() fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) }
13、defer
defer的使用
使用方式类似于栈,先进后出
//延迟调用,main函数结束前进行调用 fmt.Println("hello") defer fmt.Println("over!!") fmt.Println("world") //hello //world //over!! //多个defer的执行顺序,类似于栈的方式,先进后出,哪怕中间出现程序错误,defer修饰的语句仍然会执行 for i := 0; i < 10; i++ { defer fmt.Println(i) } -------------------------------------------- defer fmt.Println("aaaa") defer fmt.Println("bbb") defer fmt.Println("ccc") // ccc // bbb // aaaa
defer 和匿名函数的使用
// a := 10 // b := 20 // defer func() { // fmt.Printf("inner a == %d, b == %d\n", a, b) // }() // a = 1 // b = 2 // fmt.Printf("externer a == %d, b == %d\n", a, b) // externer a == 1, b == 2 // inner a == 1, b == 2 a := 10 b := 20 defer func(a, b int) { fmt.Printf("inner a == %d, b == %d\n", a, b) }(a, b) //此处参数 a=10 b=20的参与已经传入到函数中了,只是匿名函数最后执行而已 a = 1 b = 2 fmt.Printf("externer a == %d, b == %d\n", a, b) // externer a == 1, b == 2 // inner a == 10, b == 20
14、init函数
每一个包 默认都会有一个init函数,也可以自己写一个init函数
每调用一个包,程序会先执行这个包的init函数
main.go
package main import ( "fmt" "hhh/test" ) var a int = 10 func init() { fmt.Println("this is main init") } func main() { a := "xiaozhu" fmt.Println(a) { a := 1.4 fmt.Println(a) } test.Pr() }
test.go
package test import "fmt" func init() { fmt.Println("test init") } func Pr() { fmt.Println("hello wrold") }
15、字符串处理涉及的函数
http://www.zzvips.com/article/61040.html
16、值类型的变量,存在栈中,引用类型的变量,存在堆中
- 值类型:基本数据类型int、float、bool、string以及数组和struct
- 引用类型:指针、slice、map、chan等都是引用类型
以上为本期全部内容,如有疑问可以在评论区或后台提出你的疑问,我们一起交流,一起成长。
好家伙要是文章对你还有点作用的话,请帮忙点个关注,分享到你的朋友圈,分享技术,分享快乐
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
作者:小魔童哪吒