Go语言基础入门(1)
更新日期:
因为项目的需要,近几天学习了一下Go语言,作为一个已经学习过Java的初学者来说,刚开始是不太习惯Go语言的语法习惯,但是接触几天下来也就习惯了。下面是这几天学习的一些基础知识吧。
什么是Go语言
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,Go语言是基于Inferno操作系统所开发的。Go语言于2009年11月正式宣布推出,并在Linux及Mac OS X平台上进行了实现.
搭建Go语言开发环境(Sublime Text2+GoSublime+Gocode(自动代码提示))
安装Go
下载你需要的 golang版本
配置golang环境变量
系统变量名:
GOROOT值:Go的安装位置
系统变量名:Path追加值:;%GOROOT%\bin
注意:千万不要在安装路径中出现中文。否则之后将无法正常使用Go语言开发工具
配置GOPATH:Go工程所在的文件夹
值得注意:GOPATH是golang项目的特殊路径,其路径下必须包含bin、pkg、src这3个目录。golang项目的是依靠src目录来组织源代码的。
安装完毕后当然要验证一下Go是否已经正确安装了:打开Windows中的命令提示符(cmd.exe)执行命令:go version
安装Sublime Text 2配置GoSublime/GoGDB
下载ST2安装后打开它如图所示:

点击View – Show Console或按Ctrl+`(这个键就是Tab键的上一个)弹出控制台 输入如下文本按回车然后重启ST2:
import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'
重启之后,preferences菜单下会出现一个Pakage control,按下Ctrl+Shift+P后会弹出的一个可以输入命令的文本框
然后输入install,稍等片刻就会再出现一个文本框,此时输入gosublime按回车就可以安装插件了。同理把GoGDB安装好。
安装gocode,提供代码补全功能
打开cmd,输入go get github.com/nsf/gocode按回车后等待片刻后,打开%GOPATH%\bin这个路径应该能看到gocode.exe这个文件,如果没看到则执行go install github.com/nsf/gocode试试。
然后将gocode.exe剪切到%GOROOT%\bin下面,此前我们已将%GOROOT%\bin添加到Path环境变量当中,这样个拷贝动作可以确保gocode.exe在Path环境变量下。 这里你也可以直接下载Gocode.exe
准备好gocode后可以配置ST2的GoSublime插件了!点击Preferences > Package Settings > GoSublime > Settings – Default设置env的值为go的安装路径下的bin文件夹
Go语言基础
Go语言采用UTF-8编码,所以不存在乱码问题。
Hello Go——-初识Go语言
package main//当前程序的包
import "fmt"//导入其他包
const PI=3.14 //定义常量
var name="gopher"//全局变量的声明与赋值
type newType int//一般类型声明
type gopher struct{}//结构的声明
type golang interface{}//接口声明
func main(){
fmt.Println("Hello Go")//由main()函数作为程序入口
}
包的调用还有另外两种形式:(注意两者不可同时使用)
别名调用:
import std "fmt"
std.Println("hello")
省略调用:(不建议使用)
import . "fmt"
Println("hello")
Go语言的可见性规则:使用大小写来决定该变量,常量,类型,接口,结构或者方法函数是否可以被外部包所调用。根据约定,函数名首字母小写即为private,大写即为public。Go语言中没有private和public关键字。
注意包导入却没有使用会报错(这点很不同与Java,所以不要乱导包,建议用到一个导一个)
Go的基本数据类型与声明
- 布尔型:bool 1个字节 (true,false) 不能用0,1代替
- 整型:int/uint 根据平台为32位或64位 int8/uint8 1字节 (-128~127/0~255)
- 字节型:byte(uint8别名) int32别名rune
- 浮点型:float32/float64 4/8字节 7/15位小数 无double类型
- 足够保存指针的32位或64位整型 uintptr
类型零值,并不等于空值,是默认值(bool:false,string:” “,arry:[])
声明: var <变量名称> <变量类型> var a int 这个与java中定义存在很多不同。
赋值:<变量名称>=<表达式> a=123
声明同时赋值:①var<变量名称>[变量类型]=<表达式>
②<变量名称>:=<表达式> a:=123 (全局变量不能使用这种模式)
Go中不存在隐式转换,转换只能发生在两种互相兼容的类型之间
string<————->int 转换问题
var a int=65 var a int=65
b:=string(a) <-引入包"strConv"-> b:=strConv.Itoa(a)
fmt.Println(b) fmt.Println(b)
输出:A 输出:65
常量在编译时就已经确定了,表达式中的函数必须是内置函数。
iota是一个常量计数器,从0开始,组中每定义一个常量就自动递增1,每遇到一个const,iota就会被置零。
运用iota和<<结合枚举计算机存储单位
const(
B float64=1<<(iota*10)
KB
GB
TB
)
循环
Go中只有for一种循环方式,支持3种结构形式,{左括号不能放到下一行,if 的条件表达式不能有括号
a:=1 a:=1 a:=1
for{ for a<=3{ for i:=0;i<3;i++{
a++ a++ a++
if a>3{ } }
break
}
}
数组Array
定义:var <varName>[n]<type>
①var a[2] int
②a:=[2]int{1,1}
③a:=[20]int{19:1} 前19个为0,第二十个为1
④a:=[…]int{1,2,3,4}
区分指向数组的指针和指针数组
区分指向数组的指针:var p*[100]int=&a
指针数组:a:=[…]*int{&x,&y}
数组在Go中是值类型,用new创建数组返回一个指向数组的指针p:=new([10]int),p为指针,p[1]=2
切片Slice 并不是数组,指向低层数组
var s1 []int 或 s1:=make([]int,3,10),3代表容量,10代表内存容量最大为10,若不够则会变成两倍(20)
len(s1)—-内容个数
cap(s1)—-最大容量,这是一种高效率的模式
Reslice:索引以被slice切片为准,不可超过slice切片的容量,索引不可越界
append:在slice切片尾部追加元素,可以将slice追加在另一个slice后
copy(s2[2:4],s1[1,3]):将s1[1],s1[2]复制到s2[2],s2[3]
var s1 []int={1,2,3,4}这种写法是错误的
(未完待续)