(1) package、import、init函数
- package跟import其实跟java里面的概念差不多,go的话保留了两个函数:init与main。
- 每个package里可以写任意多个init,但从可读性的角度说,建议每个文件中只写一个init函数。同一个包中的多个init函数的执行顺序没有明确的说明。
- init不能被其他函数调用,而是在main执行之前被自动调用。
-
不同包的init函数根据包导入的依赖关系决定执行顺序,如下图。
- 同一个包如果被其他包导入了多次,那么它只会导入一次。
import(
. "fmt" //点的含义是你以后调用这个包的函数时可以省略包名
)
import(
f "fmt" // 别名,可以使用f.Println("hello world")
)
import (
_ "github.com/somepackage" // 只调用了该包的init函数,不使用包里面的函数
)
(2) 函数、变量声明、作用域
// 声明函数:go中的函数可以返回多个变量
func function_name([parameter list]) [return_types] {
// 函数体
}
// 举例:
func swap(x, y string) (string, string) {
return y,x
}
var v_name v_type // 指定变量类型
var v_name = value // 根据值自行判断类型
v_name := value // 初始化声明,不能用于全局变量,此时左侧的变量不应该是已经声明过的
// 也可以同时声明多个变量
var vname1, vname2, vname3 type
var vname1, vname2, vname3 = v1, v2, v3
vname1, vname2, vname3 := v1, v2, v3
var (
vname1, v_type1
vname2, v_type2
)
_ //空标记占位符,通过将函数返回值赋值给空标记,可以避免提示未使用的变量
- 全局作用域:所有的关键字、内置类型、函数
- package作用域:一个包中声明的变量、常量、函数、类型等在同一个包中可以任意访问
- 文件作用域:一个文件中通过import导入的包名,只在当前文件有效
- 函数作用域、for、if、{}自定义作用域:函数的参数返回值拥有函数作用域,for、if、{}内部的变量只拥有最小作用域
(3) 流程控制
if...else...
其实跟C++基本一样,差别在括号可以省略,直接写成if a<20这样。不过你要习惯把括号加上也是没问题的;
switch
与C++差别在于每个case不需要加break,默认就会break;如果需要继续往下走的效果可以显式使用fallthrough;
select
这个语法与switch比较类似,每个case必须是一个通信操作,允许有default子句;一般用于让程序线程在多个channel的操作上等待,待以后详细了解channel后再学习;
for
有三种形式,与C语言的for一样,或者与C中的while一样,或者根据range遍历:
for init; condition; post {}
for condition {}
for key,value := range {}
break与continue等的使用也基本一致;
(4) 类型转换
type_name(expression)
var sum int = 17;
var count int = 5;
var mean float32
mean = float32(sum) / float32(count)
(5) 指针
基本同C
注意go中的函数传参均为值传递,所以如果需要在函数内修改传入的变量的话就需要通过指针进行;
虽然slice/map/channel等部分类型为引用类型,但是做为函数参数时仍为值传递,虽然也存在一些特殊之处。
关于slice类型做为参数时情况的理解可见以下链接:
https://blog.csdn.net/future_challenger/article/details/48438017
https://www.jb51.net/article/136199.htm
网友评论