前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 基础篇

Golang 基础篇

作者头像
爱敲代码的猫
发布2019-10-17 14:38:51
4860
发布2019-10-17 14:38:51
举报
文章被收录于专栏:爱敲代码的猫爱敲代码的猫

Hello World

每种语言都有自己的Hello World,Go也不例外,Go版本的如下:

代码语言:javascript
复制
package main

import "fmt"

func main() {
	fmt.Println("Hello, World")
}

我们使用go run运行后,会在控制台终端看到Hello, 世界的输出。我们来看下这段代码:

  • package 是一个关键字,定义一个包,和Java里的package一样,也是模块化的关键。
  • main包是一个特殊的包名,它表示当前是一个可执行程序,而不是一个库。
  • import 也是一个关键字,表示要引入的包,和Java的import关键字一样,引入后才可以使用它。
  • fmt是一个包名,这里表示要引入fmt这个包,这样我们就可以使用它的函数了。
  • main函数是主函数,表示程序执行的入口,Java也有同名函数,但是多了一个String[]类型的参数。
  • Println是fmt包里的函数,和Java里的system.out.println作用类似,这里输出一段文字。

整段代码非常简洁,关键字、函数、包等和Java非常相似,不过注意,go是不需要以;(分号)结尾的。

定义变量

go语言变量的声明和java的略有不同,以声明一个int类型,变量名为age为例,go语言变量生成如下:

代码语言:javascript
复制
var age int =10

同样的变量,在java中的声明是:

代码语言:javascript
复制
int age = 10;

可以看到go的变量声明,修饰变量的类型在变量的后面,而且是以var关键字开头。

代码语言:javascript
复制
var 变量名 类型 = 表达式

最后面的赋值可以在声明的时候忽略,这样变量就有一个默认的值,称之为零值零值是一个统称,以类型而定,比如int类型的零值为0,string类型的零值是”“空字符串。

在go中除了以var声明变量之外,还有一种简短的变量声明方式:=,比如上面例子,可以如下简单声明:

代码语言:javascript
复制
age := 10

这种方式和上面的例子等价,但是少了var和变量类型,所以简短方便,用的多。使用这种方式,变量的类型由go根据值推导出来,比如这里默认是int。

定义常量

有了变量,就少不了常量,和var关键字不一样,go的常量使用const声明,这个和C里的常量一样。

代码语言:javascript
复制
const age = 10

这样就声明了一个常量age,其值是10,因为我们这里没有指定常量的类型,所以常量的类型是根据值推导出来的。所以等价的我们也可以指定常量类型,如下:

代码语言:javascript
复制
const age int = 10

相比来说,java下的常量定义就要复杂一些,要有static final修饰符,才是常量:

代码语言:javascript
复制
private static  final int AGE = 10;

这个和go的实现等价,但是它的定义修饰符比go多多了,而且常量类型不能省略。

大小写标记访问权限

我们上面的go例子中我特意用了小写的变量名age,甚至常量我也没有写成AGE,但是在java中,对于常量我们的习惯是全部大写。

在go中不能随便使用大小写的问题,是因为大小写具有特殊意义,在go中,大写字母开头的变量或者函数等是public的,可以被其他包访问;小写的则是private的,不能被其他包访问到。这样就省去了publicprivate声明的烦恼,使代码变的更简洁。

golang中根据首字母的大小写来确定可以访问的权限。无论是方法名、常量、变量名还是结构体的名称,如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用

可以简单的理解成,首字母大写是公有的,首字母小写是私有的

特别说明,这些导出规则只适用于包级别名字定义,不能使函数内部的定义。

包的规则和java很像,每个包都有自己独立的空间,所以可以用来做模块化,封装,组织代码等。 和java不同的是,go的包里可以有函数,比如我们常用的fmt.Println(),但是在在java中没有这种用法,java的方法必须是属于一个类或者类的实例的。

要使用一个包,就需要先导入,使用import关键字,和java也一样,可以参见前面的helloworld示例。

如果我们需要导入多个包的时候,可以像java一样,一行行导入,也可以使用快捷方式一次导入,这个是java所没有的。

代码语言:javascript
复制
import (
	"io"
	"log"
	"net"
	"strconv"
)

类型转换

go对于变量的类型有严格的限制,不同类型之间的变量不能进行赋值、表达式等操作,必须要要转换成同一类型才可以,比如int32和int64两种int类型的变量不能直接相加,要转换成一样才可以。

代码语言:javascript
复制
var a int32 = 13
var b int64 = 20

c := int64(a) + b

这种限制主要是防止我们误操作,导致一些莫名其妙的问题。在java中因为有自动转型的概念,所以可以不同类型的可以进行操作,比如int可以和double相加,int类型可以通过+和字符串拼接起来,这些在go中都是不可行的。

map

map类型,Java里是Map接口,go里叫做字典,因为其常用,在go中,被优化为一个语言上支持的结构,原生支持,就像一个关键字一样,而不是java里的要使用内置的sdk集合库,比如HashMap等。

代码语言:javascript
复制
ages := make(map[string]int)

ages["linday"] = 20
ages["michael"] = 30

fmt.Print(ages["michael"])

go里要创建一个map对应,需要使用关键字make,然后就可以对这个map进行操作。

map的结构也非常简单,符合KV模型,定义为map[key]value, 方括号里是key的类型,方括号外紧跟着对应的value的类型,这些明显和Java的Map接口不同。如果在go中我们要删除map中的一个元素怎么办?使用内置的delete函数就可以,如下代码删除ages这个map中,key为michael的元素。

代码语言:javascript
复制
delete(ages,"michael")

如果我们想遍历map中的KV值怎么办?答案是使用range风格的for循环,可比Java Map的遍历简洁多了。

代码语言:javascript
复制
for name,age := range ages {
	fmt.Println("name:",name,",age:",age)
}

range一个map,会返回两个值,第一个是key,第二个是value,这个也是go多值返回的优势,下面会讲。

个人练习Code
代码语言:javascript
复制
package main

import "fmt"

func main() {

	ages := make(map[string]int)
	
	ages["linday"] = 20
	ages["michael"] = 30

	//删除·michael·键值对
	//delete(ages,"michael")

	fmt.Println(ages["michael"])

	//第一个是key,第二个是value
	for name,age := range ages {
		fmt.Println("name:",name,",age:",age)
	}
	
}

函数方法

在go中,函数和方法是不一样的,我们一般称包级别的(直接可以通过包调用的)称之为函数,比如fmt.Println()把和一个类型关联起来的函数称之为方法,如下示例:

代码语言:javascript
复制
package lib

import "time"

type Person struct {
	age  int
	name string
}

func (p Person) GetName() string {
	return p.name
}

func GetTime() time.Time{
	return time.Now()
}

其中GetTime()可以通过lib.GetTime()直接调用,称之为函数;而GetName()则属于Person这个结构体的函数,只能声明了Person类型的实例后才可以调用,称之为方法。

不管是函数还是方法,定义是一摸一样的。而在这里,最可以讲的就是多值返回,也就是可以同时返回多个值,这就大大为我们带来了方便,比如上个遍历map的例子,直接可以获取KV,如果只能返回一个值,我们就需要调用两次方法才可以。

代码语言:javascript
复制
func GetTime() (time.Time,error){
	return time.Now(),nil
}

多值返回也很简单,返回的值使用逗号隔开即可。如果要接受多值的返回,也需要以逗号分隔的变量,有几个返回值,就需要几个变量,比如这里:

代码语言:javascript
复制
now,err:=GetTime()

如果有个返回值,我们用不到,不想浪费一个变量接收怎么办?这时候可以使用空标志符_,这是java没有的。

代码语言:javascript
复制
now,_:=GetTime()

学习文章

飞雪无情的博客--从Java到Golang快速入门(https://www.flysnow.org/2016/12/28/from-java-to-golang.html)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱敲代码的猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义变量
  • 定义常量
  • 大小写标记访问权限
    • 可以简单的理解成,首字母大写是公有的,首字母小写是私有的
    • 类型转换
    • map
      • 个人练习Code
      • 函数方法
      • 学习文章
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档