[TOC]
兵长:胖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...
16、值类型的变量,存在栈中,引用类型的变量,存在堆中
- 值类型:基本数据类型int、float、bool、string以及数组和struct
- 引用类型:指针、slice、map、chan等都是引用类型
以上为本期全部内容,如有疑问可以在评论区或后台提出你的疑问,我们一起交流,一起成长。
好家伙要是文章对你还有点作用的话,请帮忙点个关注,分享到你的朋友圈,分享技术,分享快乐
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
作者:小魔童哪吒
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。