2 go语言的基础
include
- 内置关键字
- 注释方法
- 代码结构(常量,变量,接口,函数的定义)
- 导入包以及包别名
- 可见性规则
- 小练习
内置关键字(25个均为小写)
- break
- case
- chan
- const
- continue
- default
- defer
- else
- fallthrough
- for
- func
- go
- goto
- if
- import
- interface
- map
- package
- range
- return
- select
- struct
- switch
- type
- var
- cap(x) 切片X的容量或者通道X的缓存容量或者数组的长度。
- close(x) 关闭通道ch(但是用于接受信息的通道是非法的)。不能往通道中发送数据。数据还可以从关闭的通道中接受(例如,任何已发送但未接收的值),并且如果通道中没有值了,接收端得到的将是该通道类型的零值。
- copy(dst,src) 将src切片中的项复制(可能是重叠)到dst切片,如果空间不够则截断;或者将字符串字节S复制到[]byte类型的b中。
- delete(m,k) 从映射m中删除其键为k的项,如果键为空就什么也不做。
- new(T) 一个指向类型T的值指针
注释方法
注释方法和js的一样
- // 单行注释
- /* */ 多行注释
代码结构
- 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
由打印结果可知,我们可以得出下面三个结论
- 由此可见,我们在运行main函数的时候,首先是执行import函数,由于调用了add包,所以先执行add,而add文件里面又调用了fortest,所以最先执行的是fortest里的init函数与声明两个变量
- 虽然这fortest里面的两个变量和add文件里面的两个变量一样,那么是不会冲突的与覆盖的。
- 每个文件被调用的时候首先执行init方法
流程图下图所示:
值类型与引用类型
- 值类型就是传递给一个函数作为参数的时候是值拷贝,函数修改这个值不会影响到原值。
- 引用类型是传递给一个函数作为参数的时候是指针类型,函数修改这个值会影响到原值
全局变量与局部变量的作用域范围
全局与局部的区别就在于作用域,看下代码的代码例子,大家猜猜看输出结果是什么:
// 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
小练习
- 如何同时定义多个常量、全局变量
- 如何同时定义多个类型
代码如下:
// 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语言的基础的更多相关文章
- iOS开发系列--C语言之基础知识
概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...
- Golang友团无闻Go语言Web基础视频教程
教程内容:GO语言资料Golang友团无闻Go语言编程基础Golang友团无闻Go语言Web基础教程 Go语言Web基础教程列表:[Go Web基础]12Go Web 扩展学习.mp4[Go Web基 ...
- 10个经典的C语言面试基础算法及代码
10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识
JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...
- c语言学习基础:[1]开发工具介绍
标签:c语言 1 2 3 4 分步阅读 学习编程语言的童鞋们一开始接触到的最多的估计就是C语言了,其次才是什么java.c++等,可以说学习c语言是我们走向编程世界的一座桥梁,学好它,对于我们学习和研 ...
- 关于JS脚本语言的基础语法
JS脚本语言的基础语法:输出语法 alert("警告!"); confirm("确定吗?"); prompt("请输入密码");为弱 ...
- 2.4JAVA基础复习——JAVA语言的基础组成数组
JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...
- 2.3JAVA基础复习——JAVA语言的基础组成函数
JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...
随机推荐
- python使用selenium
首先安装 pip install selenium 测试抓取baidu,其中的chromedriver.exe需要自己下载,百度有很多的 import timefrom selenium import ...
- git学习(七):git 对象库
git log -l -pretty=raw // 查看日志 -l是干啥的 git log -pretty=raw // git cat-file -t 哈希值 // 查看id的类型 不知道为啥这里我 ...
- ubuntu apt-get 安装指定版本软件
有时候 Ubuntu安装软件时候会提示你缺少对应版本的软件,这时候你就需要用到 sudo apt-get install softname=version 来安装对应的软件. sudo apt-get ...
- 改改"坏"代码
程序猿很多时候费了九牛二虎之力使用各种黑科技实现了某个功能,终于可以交差,但整个过程就像个噩梦,一般人是不太愿意回过头去阅读自己写的代码的,交出去的代码就让它如往事般随风吧. 可你不愿读自己的代码,却 ...
- kafka集群中jmx端口设置
jmx端口主要用来监控kafka集群的. 在启动kafka的脚本kafka-server-start.sh中找到堆设置,添加export JMX_PORT="9999" if [ ...
- MVC教程九:异常过滤器
我们平常在程序里面为了捕获异常,会加上try-catch-finally代码,但是这样会使得程序代码看起来很庞大,在MVC中我们可以使用异常过滤器来捕获程序中的异常,如下图所示: 使用了异常过滤器以后 ...
- java 生成指定区间随机数
int randNumber =rand.nextInt(MAX - MIN + 1) + MIN; // randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数
- Java设计模式(3)建造者模式(Builder模式)
Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构 ...
- web界面设计
本书描述了6个设计原理,即直截了当.简化交互.足不出户.提供邀请.使用变换.即时反应. 一.直截了当(alan cooper:"在哪里输出,就要允许在哪里输入") 1.1 行内编辑 ...
- JS设计模式学习实例之单例模式
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...