【Go语言】Go语言基础三小时上手

本篇博客介绍Go语言基础,包括变量和基本数据类型、数组、map、简单控制语句、变量作用域、函数、结构体、interface 等知识点。用心读完,三小时Go语言绝对上手!Let’s Go!
参考网站: http://tour.golang.org/#1

【Go语言初步】

package main

import (

“fmt”

)

func main() {

fmt.Println(“hello world”)

 以上是Go语言最基础的语句,有三部分组成:package main、import( )函数和main( ) 函数,其定义的格式为 func main( ){   } 。fmt.Println( )是Go的fmt包中的输出语句,类似C语言中的printf( )和、PHP里面的 echo 以及Java里面的System.Out.Println( )。
注意每一句后面是没有分号的!

【变量和基本数据类型】
定义变量有很多种方式,最标准的是使用var 关键字。语法类似  var name string  这样子,即 ”var + 变量名+变量类型“ 。定义好一个变量就要去使用它,那么就是赋值语句:var name string = ” liukaining”  当然你可以先定义在赋初值,写过C语言的都懂,只是要记住Go语言不允许定义了但未被使用的变量存在,所以还是建议完整的写法。

Go语言支持的变量类型有很多种,像常见的  int ,float ,string,bool 这些都支持的,只是在Go语言中有相应的一些变化。现将Go语言支持的基础变量类型记录如下:
bool, int8 ,byte , int16 , int ,uint ,uintptr , float32 , float64 ,complex64 , complex128 , string , rune , error .

在Go语言中一个变量的长度(字节数)是有很大差距的。请看图

这些东西基础的了解就好,不必深究。要知道的是一个int8的数字和一个int16的数字是不能完整的互相转换的。Go语言提供了强制转换方式,语法类似目标类型(被强制转化的变量)实例如下:
var age int = 8 
var str_age string = string(age) 

在定义变量的时候,往往不需要var关键字,因为Go语言提供了很强大的类型推断机制,我们不需要强制定义变量的类型,可以交给它自己去判断。举例如下:
var name = “lkn”
age : = 22
上面第一句话,将stringl类型的值“lkn”赋值给name,此时name就被推断为string类型,而第二句话则采用了简写方式,代表age是一个int类型,值是22。你会在今后的开发当中注意到 := 会使用的非常频繁,这是Go期待提高效率同时比C/C++等语言代码更少的设计理念。为这个特点点个赞!

有一个问题要注意,虽然说Go可以像上面这种推断出来变量的类型,但是一旦指定了某一个变量的类型就不允许随便改动,因为Go语言是一种强类型的语言,就是说你不能直接将不同类型的值赋给同一个变量,比如上面的那个,你不能写在后面又写上 name=10 age = “lkn” 这样的东西。写过PHP ,JS的同学肯定遇到过一个变量可以在不同时间使用同样名字变量的不同类型的值,这在Go语言中是不允许的。上面已经说过实现这种事需要进行类型强制转换的。当然这个问题的处理方式不会是这么粗糙,后面的interface会详细介绍这种情况。

Go语言还有一个东西叫做多重赋值 例如下面的代码
name , tel = “lkn” , “15200806084″
min,max : = 10,100 
第一行意思是定义两个变量,根据后面推断出是string,然后name的值是lkn,tel的值是 15200806084 ,后面的则是用了:=的方式,不同的变量用 分隔开。这种处理的机制好在哪里?大家想想原来我们是怎么交换两个变量的?现在我们不需要一个临时变量就可以交换,i , j = j, i  这样不就直接交换了i 和 j 么?是不是又要点一个赞呢?

【数组】
定义并且赋值:简易方式  arr : = [ ] int64 { 3, 5, 7 }
标准方式  var arr [10] int = [10] int {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
打印数组:fmt.Println(“arr=”, arr)
取第二个值:fmt.Println(arr[1])
获取数组长度:length= len(arr) 
遍历数组:
for k, v := range arr {
fmt.Println ( k “=”, v)
}

以上就是数组的最基础使用了啊。遍历数组的时候要注意for 是没有括号的,k 代表key ,v 代表 value ,range关键字在这里是Go的又一个特色,可以简化数组的遍历代码。对了如果不想要用key 则可以将k用  _  (下划线)代替。

这里有一个问题:这个数组是固定长度的,如果要在后面再增加一个元素应该怎么做?Go有这样一个方法可以解决这个问题:arr = append(arr, 4)  这个函数大家写java 的时候肯定见过类似的,第一个参数当然是数组了,第二个参数就是在这个数组最后面增加一个元素 4 。这样就可以改变数组长度。
简单的数组就这样,后面使用到重点的再记录。

【map】
map这个东西就是key – value 键值对。Go语言中是这样定义的
var myMap map[string] int
解释一下:var 不用说了,myMap 变量名,map 变量类型,中括号中的string 定义key 的类型,最后的int 定义了value的类型。
创建map 需要用到make( )
myMap = make(map[string] int )
赋值
myMap["lkn"] = 22
当然这一切都可以简写:
myMap : = map[ string ] int { ” lkn” : 22}
访问某一个key
fmt.Println(myMap["lkn"])
遍历map(和遍历数组类似)
for k, v := range myMap {
fmt.Println(k, “=”, v)
}

简单的map就这样,后面使用到重点的再记录。

【简单控制语句】
控制语句无非就是判断、循环、选择,对应的就是if ,for  和 switch  除了在使用的时候不写括号不写分号之外,我真心找不出Go和C的区别。
举个例子就过了:
if b {
p(” b is true”)
} else {
p(” b is false”)
}

for age:=0; age<10; age++ {
p(“age is “, age)
}

switch n.(type) {
case string:
p(“n is string”)
break
case int:
p(“n is int”)
break
}

哦哦,我想起来了有一个很大的区别,左括号必须要和if for  switch在同一行! 我可是用了红色的标注,这一点必须要遵守!

【变量作用域】

这个问题和其他语言当中的概念都基本类似,全局变量,局部变量只需要看其出现的位置。一般你可以在所有函数之外定义一些变量当做全局变量,这些变量在任何函数里面都可以使用,而在某一个函数里定义的变量只能在这一个函数当中使用,别的函数中访问不到。还有就是有的包中一些变量是大写的,这些变量或者函数是可以导出的,就是说可以被外界访问到的,类比Java中一些public 和 protect 属性的方法,而对应的小写字母的变量或者函数则只能是包内使用,不能被外界访问,类似于private 。简单的大小写就可以加以区分公有或者私有变量和函数,这也是Go的一个亮点。举例略。

此外,Go语言支持闭包。我没有仔细研究过这个东西,等以后有时间专门讨论一下Go的闭包以及JavaScript的闭包。

【函数】
函数很重要,在Go语言中是一等公民,类似JS。
函数是由关键字func 来定义的,完整的定义是
func funcName( paramName paramType) returnType  { return statement } 
解释:
func 关键字
funcName 函数名
paramName 参数名
paramType 参数类型
returnType 返回值类型
return statement 返回语句

函数参数可以有多个,返回值也可以有多个,多个返回值用写在小括号里面,彼此用逗号分隔。

允许匿名函数,即在一个函数里面重新定义一个函数,只是格式上可以省略funcName 这个东西。

函数可以作为返回值。例如
p : = fmt.Println( ) 
p(“我被替换了!”) 

这个和fmt.Println(“我被替换了!”) 效果完全一样,但是代码减少了很多很多。你完全可以重新定义一些常用的函数,封装起来调用相对简单一些的函数。

【结构体】
这个结构体和C语言中的几乎完全一样,定义如下:
type User struct {
Name string
Age int
}
上面定义了一个结构体User ,有两个成员。

可以给结构体加上函数,专递的时候注意是传递指针
func(u *User) PrintName() {

fmt.Println(u.Name)
}

使用方式:

aUser := &User{
Name: “dong”,
Age: 23,
}
aUser.Name = “sui chang ying”
aUser.PrintName( )

与C语言几乎一样。写过Java 的你也觉得很亲切。
访问数组元素是用中括号,访问map的特定键的值是用中括号加引号,访问结构体的成员是用点号。
同时注意单引号和双引号的区别,单引号一般不会用在Go语言中,一般都是双引号,这个和PHP有很大不同。

【interface】

写Java的时候经常会见到,接口。
Go语言的接口能够解决一个变量附多个不同类型的值的问题,或者你不知道是要用什么类型的参数的时候你可以尝试使用interface。想想Java里面的泛型,object对象和接口。
定义一个新的空接口并且使用:
var n interface( )
n = 10
fmt.Println(n)
n=”lkn” 
fmt.Println(n)

第一个输出 10 ,第二个输出 lkn

但是你不能写将interface类型的变量和其他类型的变量直接做运算,比如加减和字符串链接,必须要用到类似 n.(int) + 30 或者n.(string) + “lkn” 这种的格式 。

由于是刚刚接触Go,我关于Interface 理解的还不是很深,后面会重新分析其原理。

OK,我觉得基本的Go语法应该已经有了。
三个小树足够上手,让我们一起Go !

刘凯宁@C2P
2014年7月7日

ps:今天是实习第一天,签订了实习合同,分配了企业邮箱,了解了最核心的产品,热璞科技还是相当给力哦!

 

 

 

Share

【Go语言】Go语言基础三小时上手》上有 1 条评论

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*


*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>