include

  1. 内置关键字
  2. 注释方法
  3. 代码结构(常量,变量,接口,函数的定义)
  4. 导入包以及包别名
  5. 可见性规则
  6. 小练习

内置关键字(25个均为小写)

  1. break
  2. case
  3. chan
  4. const
  5. continue
  6. default
  7. defer
  8. else
  9. fallthrough
  10. for
  11. func
  12. go
  13. goto
  14. if
  15. import
  16. interface
  17. map
  18. package
  19. range
  20. return
  21. select
  22. struct
  23. switch
  24. type
  25. var
  26. cap(x) 切片X的容量或者通道X的缓存容量或者数组的长度。
  27. close(x) 关闭通道ch(但是用于接受信息的通道是非法的)。不能往通道中发送数据。数据还可以从关闭的通道中接受(例如,任何已发送但未接收的值),并且如果通道中没有值了,接收端得到的将是该通道类型的零值。
  28. copy(dst,src) 将src切片中的项复制(可能是重叠)到dst切片,如果空间不够则截断;或者将字符串字节S复制到[]byte类型的b中。
  29. delete(m,k) 从映射m中删除其键为k的项,如果键为空就什么也不做。
  30. new(T) 一个指向类型T的值指针

注释方法

注释方法和js的一样

  1. // 单行注释
  2. /* */ 多行注释

代码结构

  • go程序是通过package来组织的(与python类似,通过包来组织)
  • 只有package名称为main的包可以包含main函数
  • 一个可执行程序有且仅有一个main包
  • 通过import 关键字来导入其他非 main包
  • 通过const关键字来进行常量的定义
  • 通过函数体外部使用var关键字来进行全局变量的声明与赋值
  • 通过type关键字来进行结构(struct)或者(interface)的声明
  • 通过func关键字进行函数的声明。

代码例子如下:

package main   //  当前程序包名,必须写在第一

import "fmt"   // 导入其他的包

const PI = 2.14   // 常量定义

var name = "Leo"  // 全局变量定义

type newType int   // 一般类型声明

type gopher struct{}   // 结构的声明  gopher是名字 {} 里面写的是逻辑代码

type golang interface{} // 接口的声明  golang是名字  {} 里面写的是逻辑代码

func main(){
fmt.Println("hellow world!"")
}

导入包

导入包我们除了可以一个一个的import导入进去,也可以import(一堆包名),代码如下:

import "fmt"   // 导入其他的包
import "os"
import "time"
import "strings" // 也可以这样写 import (
"io"
"sync"
)
  • 导入进去以后,我们可以就像python那样了,包名.方法名 去使用。
  • 如果导入包之后未调用其中的函数或者类型将会报编译错误,这样的话时为快速编译而改进的。如:
imported and not userd: "io"
包(package) 别名

等同于python里面的as ,不建议别名和包名一块使用。

  • import cname "fmt"
import std "fmt"
func main() {
std.Println("hellow world!")
} // 或者如下的例子 import (
"fmt"
t "go_dev/day2/example1/add"
) func main() {
fmt.Println("Name:", t.Name)
fmt.Println("Age:", t.Age)
}
  • import . "fmt"的方法,那么就不需要使用 方法名加上包名了,如下所示:
import . "fmt" // 导入其他的包
func main() {
Println("helddddlow world!")
}

init函数

每个源文件都可以包含一个init函数,在执行main函数之前init函数会被go运行框架执行。

// main
package main import (
"fmt"
t "go_dev/day2/example1/add"
) func init() {
fmt.Println("begin to init") // 执行main之前优先执行init函数
} func main() {
fmt.Println("Name:", t.Name)
fmt.Println("Age:", t.Age)
}

包导入先后顺序

我们知道有init函数,设我们有a,b2个包,,假设我们导入一个的这个a包里面有init函数的时候,且这a个包又导入了另外一个b包,另外一个b包也有init函数,那么他们init函数执行的先后顺序是怎么样的?

我们先看看代码目录结构:

我们先看看代码,从最深层里面的包来看,然后一层一层往外到最外层的main。

f1包
// f1
package fortest // package名字要和目录一样 import (
"fmt"
) var Age int = 111 // 定义两个变量,看会不会冲掉调用者add里这两个变量
var Name string = "Leo" func init() {
fmt.Println("init in f1")
fmt.Println("f1.Age", Age)
fmt.Println("f1.Name", Name)
Age = 22
fmt.Println("f1.Age after change", Age)
}
add1包
// add
package add // package名字要和目录一样 import (
"fmt"
_ "go_dev/day2/example1/fortest" // 引用fortest包,加个下划线是因为引用这个包(引用后init函数会起作用)而不想使用他
) var Name string = "Leo" // 同样两个变量
var Age int = 22 func init() {
fmt.Println("init in add1")
fmt.Println("add1.Name", Name)
fmt.Println("add1.Age", Age)
}
main包
// main
package main // package名字要和目录一样 import (
"fmt"
t "go_dev/day2/example1/add" // 前面加个t表示是给add起了一个别名为t
) func init() {
fmt.Println("begin to init")
} func main() {
fmt.Println("Name:", t.Name)
fmt.Println("Age:", t.Age)
}

此时我们运行下main函数试试看,运行命令和打印结果如下:

C:/go/bin/go.exe run main.go
init in f1
f1.Age 111
f1.Name Leo
f1.Age after change 22
init in add1
add1.Name Leo
add1.Age 22
begin to init
Name: Leo
Age: 22

由打印结果可知,我们可以得出下面三个结论

  1. 由此可见,我们在运行main函数的时候,首先是执行import函数,由于调用了add包,所以先执行add,而add文件里面又调用了fortest,所以最先执行的是fortest里的init函数与声明两个变量
  2. 虽然这fortest里面的两个变量和add文件里面的两个变量一样,那么是不会冲突的与覆盖的。
  3. 每个文件被调用的时候首先执行init方法

流程图下图所示:

值类型与引用类型

  1. 值类型就是传递给一个函数作为参数的时候是值拷贝,函数修改这个值不会影响到原值。
  2. 引用类型是传递给一个函数作为参数的时候是指针类型,函数修改这个值会影响到原值

全局变量与局部变量的作用域范围

全局与局部的区别就在于作用域,看下代码的代码例子,大家猜猜看输出结果是什么:

// god
package main import (
"fmt"
) var g string = "G" // 全局变量是G func n() {
fmt.Println(g)
} func m() {
g := "O" // 定义局部变量O
fmt.Println(g)
} func main() {
n()
m()
n()
}

我们先分析下上面的过程

  • 我们先定义了一个g变量,值为G
  • 然后我们在n函数里面直接使用了这个g变量
  • 我们在m函数里面定义了一个局部变量g,作用域范围只在这个函数。

    综合上面三个说的点,打印结果是GOG。

试想下如果把m函数换成下面的代码,输出结果会是啥?

func m() {
g = "O" // 定义局部变量O
fmt.Println(g)
}

g="O" 这个是直接把全局变量修改了O,所以打印结果就是GOO了。

可见性规则

在go语言中,使用大小写来决定该常量、变量、类型、接口、结构或者函数是否可以被外部调用,约定规则如下:

  • 函数名首字母小写即为private
  • 函数名首字母大写为public

小练习

  1. 如何同时定义多个常量、全局变量
  2. 如何同时定义多个类型

代码如下:

// testme
package main import (
"fmt"
) // 定义多个常量
const (
PI = 3.14
h1 = "Leo"
w = "Beijing"
) // 全局变量的声明与赋值
var (
name = "Leo"
Name1 = "ljf"
age = 22
) // 一般类型的声明
type (
newType int
type1 float32
type2 string
type3 byte
) func main() {
fmt.Println(PI, w, age)
}

2 go语言的基础的更多相关文章

  1. iOS开发系列--C语言之基础知识

    概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...

  2. Golang友团无闻Go语言Web基础视频教程

    教程内容:GO语言资料Golang友团无闻Go语言编程基础Golang友团无闻Go语言Web基础教程 Go语言Web基础教程列表:[Go Web基础]12Go Web 扩展学习.mp4[Go Web基 ...

  3. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  4. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  5. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  6. Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识

    JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...

  7. c语言学习基础:[1]开发工具介绍

    标签:c语言 1 2 3 4 分步阅读 学习编程语言的童鞋们一开始接触到的最多的估计就是C语言了,其次才是什么java.c++等,可以说学习c语言是我们走向编程世界的一座桥梁,学好它,对于我们学习和研 ...

  8. 关于JS脚本语言的基础语法

    JS脚本语言的基础语法:输出语法  alert("警告!");  confirm("确定吗?");   prompt("请输入密码");为弱 ...

  9. 2.4JAVA基础复习——JAVA语言的基础组成数组

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  10. 2.3JAVA基础复习——JAVA语言的基础组成函数

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

随机推荐

  1. [转]看懂Oracle执行计划

    原文地址:https://www.cnblogs.com/Dreamer-1/p/6076440.html 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径 ...

  2. 使用EGit插件将Eclipse现有项目分享到git@osc

    . . . . . 程序员一定要养成使用版本管理工具的好习惯,即使是自己一个人开发的项目也要加入到版本管理工具中.使用版本管理工具主要有两个好处:一个是更好的管理多个副本,这个优势不用说了:另一个就是 ...

  3. ython strip lstrip rstrip使用方法

    Python中的strip用于去除字符串的首尾字符,同理,lstrip用于去除左边的字符,rstrip用于去除右边的字符. 这三个函数都可传入一个参数,指定要去除的首尾字符. 需要注意的是,传入的是一 ...

  4. centos7 安装oracle jdk 与openjdk 实现切换

    1. 分别安装oraclejdk 与openjdk #下载安装oraclejdk rpm -ivh --prefix=/usr.java/java1.8 ***.rpm #安装openjdk su - ...

  5. 【Unity Shader】UnityCG.cginc中一些常用的函数

    // 摄像机方向(视角方向) float3 WorldSpaceViewDir(float4 v) // 根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向 float3 Unit ...

  6. PTS无法同步

    最近在使用PTS的时候,一直重现PTS无法同步的情况,一直显示No block source available,在查了中英各种帖子之后,终于解决了这个问题,下面是解决的办法. 在windows下运行 ...

  7. Android——黑名单管理(二)

    说明:多加一点完善 1.在操作类 DAO 将连接数据库也放到了构造方法中(错误),加删除全部的方法 2.主界面增加了姓名一栏,用layout文件将对话框分离出来 3.删除加确认提示 4.加删除全部按钮 ...

  8. Ext.ux.grid.feature.Searching 解析查询参数,动态产生linq lambda表达式

    上篇文章中http://www.cnblogs.com/qidian10/p/3209439.html我们介绍了如何使用Grid的查询组建,而且将查询的参数传递到了后台. 那么我们后台如何介绍参数,并 ...

  9. Android指南 - 样式和主题

    本文翻译自:https://developer.android.com/guide/topics/ui/themes.html Style和theme词汇是专用术语,下文直接使用而不翻译. 样式和主题 ...

  10. centos7配置kerberos服务,并使用JAAS登录

    准备两个虚拟机:192.168.1.101.192.168.1.102,101作为kerberos的server端,102作为kerberos的client端.开启88端口. 1.安装kerberos ...