可以在变量前加入"&",符号,这样就会变成该变量的内存地址
使用"*",可以接受内存地址,详细代码如下:
func main(){
fmt.Println(&name)
namesty(&name)
print(name)
}
func namesty(name *string) {
//使用指针用内存地址更换变量名称
*name="code"
}
使用*接受了内存地址之后就可以从内存地址改变这个变量,于是下面的print输出语句可以发现name的值变成了code。
switch可以使用case判断值,当值没有赋予时可以编程一个表达式,如:
a:=10
switch {
case a>5:
println("他是真的哦")
break
default:
println("sdgdg")
}
当switch 变成了switch a是,就只能判断数字了,因为类型冲突了
控制流的代码时没有(),包括循环的,if都只能写成
if name!="you names"{
println(name)
}
的形式,所幸的是有大括号且大括号不可以换行
循环:
for i:=1;i<=10;i++{
fmt.Println(i)
}
可以发现还是没有()的符号,而且当你想要死循环的时候可以
for{
}
跳出当然还是用break
defer延迟函数,只有当剩下的全部执行完时才会执行包括了defer的哪一行语句
而且你会发现一个情况,当有两个defer函数时,他会下执行最下面然后再执行上面一边,也就意味着当有defer函数时,自动将defer写进了最后面,而defer后面一行的defer时比上面的defer先执行的。
defer会直接将他后面的代码写进他的前面!!!
for i:=1;i<=10;i++{
defer fmt.Println(-i)
defer fmt.Println(&i)
fmt.Println(i)
}
panic强制停止当前的控制流!!!
if i>5{
panic("namesdgdfgdfg")
}
会中断当前函数的执行,倘若有defer任然会正常执行defer的代码。
recover函数可以强制获取当前的控制权,但是当没有问题时recover只会返回nil
go的映射是一个哈希表,使用map关键字
例如:
stet:=map[string]int{
"name":10,
"code":15,
}
fmt.Println(stet)
可以发现他利用map关键字定义了一给类型为string的键值,而后使用int表示他对应的值时int形式。
还可以使用stet["names"]=10来增加
stet["name"],用来获取到name为主键后面的值
还可以使用delete(stet,"code")来删除掉stet映射的code键值。
结构
type namest struct {
name string
code string
a int
}
当你向namest变量类型赋值3时,
emb:=namest{"12","sdf",10}
获取的话则是
fmt.Println(emb.name)
你可以把它看做一个接口类。
也可以嵌入元素。
type namests7 struct {
namest
mid int
}