在环境变量中设置GOPARH,项目就到GOPARH指定的目录中运行
为了更好的管理项目中的文件,要求将文件都要放在相应的文件夹中。GO语言规定如下的文件夹如下:。
在go语言中包的定义和使用: 定义包名要和目录名相同,在scr下的包名可以为main
在导入包名和调用自定义其它包的时候,尽量使用相对路径,不然他会按照你设置的GOPARH进行搜索了
如:在scr的main文件中调用scr/user1/uz.go中的函数时
import "./user1"
1、如果先编译go buile再运行
2、直接运行(他把编译的这个环节给隐藏了)
直接go文件通过go run来进行运行
两种运行的区别:
1)如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有go开发环
境的机器上,仍然可以运行
2)如果我们是直接go run go源代码,那么如果要在另外- -个机器上这么运行,也需要go
开发环境,否则无法执行。
3)在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件
变大了很多。
如果类型相同,一次可以声明多个变量 ,如var a,b,c int
如var sun int 声明了一个int型的变量,默认为0
自动推导类型 变量名 :=值
显式类型定义 : const 常量名 类型=值
隐式类型定义 : const 常量名=值
多个相同类型的声明可以简写为: const c_name1, c_name2 = value1, value2
注意:常量的值不允许查看地址也不能声明了不给值
const(
a =iota
b
c =iota
d=123
e
f=iota
g
)
fmt.Println(a,b,c,d,e,f,g)
//结果为:0 1 2 123 123 5 6
iota第一个开始从0进行自增赋值
如果两个在一行中,并且都没有自定义赋值,iota数不会进行增加,
如果自定义变量,如果不用iota,那么变量会跟着这个自定义的一样
fmt.Println()和fmt.Print()的区别就是前者自带换行
fmt.Scanf(&a)//可以直接进行接受输入
Fmt.Scanf(“%d %s”,&a,&b)//代表接受一个整数和一个字符串,其中要用空格进行隔开,不能使用换行
建议地类型转成高类型,不然会导致数据精度
for
for 初始化;条件;变化语句{
......
}
//这个for不像C语言,他不需要括号
在go语言中没有while,但是for也可以实现while
for 条件{
......
}
if
if(){
......
}else if(){
......
}else{
......
}
switch
swicth 变量{
case 条件:
…
case 条件:
…
defualt:
…
}
定义:
func 函数名(形参){
\\代码体
}
有返回值时的格式:在go中可以允许有多个放回值
func 函数名(形参)函数返回值{
\\代码体
}
例如:
package main
import "fmt"
func main() {
a:=10
b:=20
sum:=Add(a,b)
fmt.Println(sum)
}
func Add(a int,b int)int{
return a+b
}
函数字面量的语法和函数声明相似,区别在于func关键字后没有函数名
package main
import "fmt"
func main(){
sum :=func (a,b int)int{//把函数作为一个值赋值给sum
return a+b
}(10,20)//使用()直接进行调用
fmt.Println(sum)//函数地址
}
函数字面量的语法和函数声明相似,区别在于func关键字后没有函数名
通过匿名函数这种方式定义的函数可以访问完整的词法环境,就是定义的内部函数可以引用改函数的变量
func squares() func() int { //func() int 为返回值意思着squares的返回值是func(),二func()的返回值是int
var x int
return func() int {
x++
return x*x
}
}
func main() {
f := squares()
fmt.Printf("%T\n",f)
fmt.Println(f()) // "1"
fmt.Println(f()) // "4"
fmt.Println(f()) // "9"
fmt.Println(f()) // "16"
}
squares的例子证明,函数值不仅仅是一串代码,还记录了状态。在squares中定义的匿名内 部函数可以访问和更新squares中的局部变量,这意味着匿名函数和squares中,存在变量引 用。这就是函数值属于引用类型和函数值不可比较的原因。Go使用闭包(closures)技术实 现函数值,Go程序员也把函数值叫做闭包。
在go语言中,可以把函数看作一个类型的值对待
函数值属于引用类型和函数值不可比较,也不能用函数值作为map的key,但是可以和nil作比较
如果函数类型的零值是nil。调用值为nil的函数值会引起panic错误:
使用函数值,我们可以将遍历结点的逻辑和操作结点的逻辑分离,使得我们可以复用遍历的逻辑,从 而对结点进行不同的操作。(这个我还不知道什么意思)
package main
import "fmt"
func main(){
te(1,2,3,4)
}
func te(arr ... int){
for i:=0;i
注意:在不定参数后面不可以加参数,不然只会把一个只给不定参数,其它值给后面的参数
作用域分为局部作用域和全局作用域
在for中的作用域
func main() {
i :=0
for i:=0;i<3;i++{
fmt.Println(i)//0,1,2
}
fmt.Println(i)//0
}
函数内为局部变量,函数外为全局变量
package main
import "fmt"
var a int = 10//定义全局变量a
func main() {
var a int =1
fmt.Println(a)
Add()
}
func Add()(){
fmt.Println(a)
}
全局变量注意的一些方面: