03.golang入门_lynnyq的博客-程序员资料

技术标签: Golang  golang  入门  基础  

golang入门

1.常用命令

  • Go命令

在命令行或终端输入go即可查看所有支持的命令

  • Go常用命令简介
go get:获取远程包(需提前安装 git或hg)
go run:直接运行程序
go build:测试编译,检查是否有编译错误
go fmt:格式化源码(部分IDE在保存时自动调用)
go install:编译包文件并编译整个程序
go test:运行测试文件
go doc:查看文档
  • 查看本地文档
godoc -http=:8080

浏览器输入http://127.0.0.1:8080/即可访问本地文档

2.注释

//      :单行注释
/* */   :多行注释

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

关键字不能用于自定义名字,只能在特定语法结构中使用。

break      default       func     interface   select
case       defer         go       map         struct
chan       else          goto     package     switch
const      fallthrough   if       range       type
continue   for           import   return      var

此外,还有大约30多个预定义的名字,比如int和true等,主要对应内建的常量、类型和函数。

内建常量: true false iota nil

内建类型: int int8 int16 int32 int64
          uint uint8 uint16 uint32 uint64 uintptr
          float32 float64 complex128 complex64
          bool byte rune string error

内建函数: make len cap new append copy close delete
          complex real imag
          panic recover

4.package别名

当使用第三方包时,包名可能会非常接近或者相同,此时就可以使用别名来进行区别和调用。

package main

import (
    io "fmt"
)

func main() {
    // 使用别名调用包
    io.Println("Hello World!")
}

省略调用:

不建议使用,易混淆

不可以和别名同时使用

package main

import (
    . "fmt"
)

func main() {
    // 使用别名调用包
    Println("Hello World!")
}

5.可见性规则

Go语言中,使用 大小写 来决定该 常量变量类型接口结构函数 是否可以被外部包所调用,根据约定:

函数名首字母 小写 即为private

函数名首字母 大写 即为public

6.变量

  • 单个变量的声明与赋值

    变量的声明格式:var <变量名称> <变量类型>

    变量的赋值格式:<变量名称> = <表达式>

    声明的同时赋值:var <变量名称> [变量类型] = <表达式>

package main

import (
    "fmt"
)

var a int

func main() {
    var b int = 1
    var c = 2

    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}
  • 多个变量的声明与赋值

全局变量的声明可使用 var() 的方式进行简写

全局变量的声明不可以省略 var但可使用并行方式

所有变量都可以使用类型推断

局部变量不可以使用 var() 的方式简写,只能使用并行方式

package main

import (
    "fmt"
)

var (
    a = 1
    b = 2
    c = 3
)

func main() {

    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}

7.变量的类型转换

Go中不存在隐式转换,所有类型转换必须显式声明

转换只能发生在两种相互兼容的类型之间

类型转换的格式: [:]= ()

package main

import (
    "fmt"
)

func main() {
    var a int = 65
    b := string(a)
    fmt.Println(b)
}

输出结果:A

string() 表示将数据转换成文本格式,因为计算机中存储的任何东西
本质上都是数字,因此此函数自然地认为我们需要的是用数字65表示
的文本 A 

如果需要输出转换后为字符串65可以使用strconv包的Itoa()方法

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var a int = 65
    b := string(a)
    c := strconv.Itoa(a)
    d, _ := strconv.Atoi(c)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)
}

输出:

A
65
65

8.常量

  • 常量的定义

常量的值在编译时就已经确定

常量的定义格式与变量基本相同

等号右侧必须是常量或者常量表达式

常量表达式中的函数必须是内置函数

  • 常量的初始化规则与枚举

在定义常量组时,如果不提供初始值,则表示将使用上行的表达式

使用相同的表达式不代表具有相同的值

iota是常量的计数器,从0开始,组中每定义1个常量自动递增1

通过初始化规则与iota可以达到枚举的效果

每遇到一个const关键字,iota就会重置为0

package main

import (
    "fmt"
)

const (
    A = 'A'
    B
    C  = iota
    D  = 100
    E  = iota
)

func main() {
    fmt.Println(A)
    fmt.Println(B)
    fmt.Println(C)
    fmt.Println(D)
    fmt.Println(E)
}

输出:

65
65
2
100
4
  • 示例:结合常量的iota与<<运算符实现计算机存储单位的枚举
package main

import (
    "fmt"
)

const (
    B  float64 = 1 << (iota * 10)
    KB 
    MB 
    GB 
    TB 
    PB 
)

func main() {
    fmt.Println(B)
    fmt.Println(KB)
    fmt.Println(MB)
    fmt.Println(GB)
    fmt.Println(TB)
    fmt.Println(PB)
}

9.运算符

  • Go中的运算符均是从左至右结合

    优先级(从高到低)



^      !                                               (一元运算符)
*       /    %    <<    >>    &      &^
+      -     |      ^                                (二元运算符)
==   !=   <    <=    >=    >
<-                                              (专门用于channel)
&&
||
  • 位运算符
 6:0110
11:1011

&  按位与
|  按位或
^  按位异或
&^ 按位取反
<< 左移 
>> 右移
package main

import (
    "fmt"
)

/*
 6:0110
11:1011
------------------
&: 按位与:两个都是1才是1,否则就是0                                               二进制:0010 十进制:2
|: 按位或:如果有一个是1就是1,否则就是0                                             二进制:1111 十进制:1+2+4+8=15
^: 按位异或:只有一个是1的时候才是1,否则为0                                       二进制:1101 十进制:1+0+4+8=13
&^:按位取反:第二个数的位上是1把第一个数的同位改为0,否则为第一个数的位上的数       二进制:0100 十进制:0+0+4+0=4
*/

func main() {
    fmt.Println(6 & 11)
    fmt.Println(6 | 11)
    fmt.Println(6 ^ 11)
    fmt.Println(6 &^ 11)
}

10.控制语句

10.1判断语句if

  • 条件表达式没有括号
  • 支持一个初始化表达式(可以是并行方式)
  • 左大括号必须和条件语句或else在同一行
  • 支持单行模式
  • 初始化语句中的变量为block级别,同时隐藏外部同名变量
package main

import "fmt"

func main() {
    a := 3
    if a < 1 {
        fmt.Println("a小于1")
    } else {
        fmt.Println("a不小于1")
    }
}

10.2循环语句for

  • Go只有for一个循环语句关键字,但支持3种形式
  • 初始化和步进表达式可以是多个值
  • 条件语句每次循环都会被重新检查,因此不建议在条件语句中使用函数,尽量提前计算好条件并以变量或常量代替

  • 左大括号必须和条件语句在同一行

package main

import "fmt"

func main() {
    /*for 循环第一种形式*/
    a := 1
    for {
        if a > 3 {
            break
        }
        a ++
        fmt.Println(a)
    }
    fmt.Println("========================================")

    /*for循环第二种形式*/
    b := 1
    for b < 3 {
        fmt.Println(b)
        b++
    }
    fmt.Println("========================================")

    /*for循环的第三种形式*/
    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }

}

10.3选择语句switch

  • 可以使用任何类型或表达式作为条件语句
  • 不需要写break,一旦条件符合自动终止
  • 如希望继续执行下一个case,需使用fallthrough语句
  • 支持一个初始化表达式(可以是并行方式),右侧需跟分号
  • 左大括号必须和条件语句在同一行
package main

import "fmt"

func main() {
    switch age := 20; {
    case age >= 18:
        fmt.Println("大于等于18岁")
        fallthrough
    case age >= 19:
        fmt.Println("大于等于19岁")
        fallthrough
    case age >= 20:
        fmt.Println("大于等于20岁")
    }
}

10.4跳转语句goto, break, continue

  • 三个语法都可以配合标签使用
  • 标签名区分大小写,若不使用会造成编译错误
  • Break与continue配合标签可用于多层循环的跳出
  • Goto是调整执行位置,与其它2个语句配合标签的结果并不相同
package main

import (
    "fmt"
)

func main() {
No1:
    for i := 0; i < 10; i++ {
        for j := 0; j < 10; j++ {
            if i == 5 && j == 5 {
                fmt.Println("i等于5并且j等于5")
                break No1
            }
        }
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lynnyq/article/details/79375116

智能推荐

服务器桌面监控,GitHub - 373137461/wallpaper_monitor: 适用于 Wallpaper Engine 等桌面壁纸软件的服务器状态监控软件,使用 PHP 开发..._瓜子仁呀的博客-程序员资料

Wallpaper Monitor一款为 Wallpaper Engine 等壁纸软件设计的服务器监控小插件,使用 PHP 编写使用需要 Linux 服务器,并且安装了 Web 服务器 + PHP 5.6 以上,可以是 Nginx、Apache 等。注意:默认的壁纸包含不适合未成年人浏览的内容,有需要请自行替换。壁纸替换方法:修改 index.php ,找到第 174 行,替换 url 中的链接为...

RPA认证 Developer UIPath Certificate,细说uipath认证学习,Online Quiz和Practical Exam项目详解_u010369735的博客-程序员资料

UIPath,RPA里算是比较简单易操作的一款软件了,因为公司业务的需要,代理uipath以及部署业务,所以接触到了uipath。从开始到最终做到企业项目部署,大概用了两个月的时间,收获不少。自己之前是做过后端开发,前端以及手机端软件自动化的相关开发工作(触动sprite…),所以学习起来挺快的。最终花了两周多的时间,阅读了官方的文档,uiapth官方的学院,以及第三方一些文档,完成了整个uipa...

本地服务器搭建(4.1)---Centos7.3安装mysql后重装postfix_LIUDIMIN的博客-程序员资料

树挪死,人挪活。大城市小人物,生活最终会把你变成你讨厌的人。在安装mysql之前,会执行一段yum remove mariadb*,卸载centos7自带的mariadb,这时候我发现貌似卸载后最后个执行了postfix断开依赖,估计是被卸载了,再次安装postfix报错:sudo yum install postfix错误:软件包:2:postfix-2.10.1-7.el...

【AndroidManifest.xml详解】Manifest属性之sharedUserId、sharedUserLabel_汤米粥的博客-程序员资料

android:sharedUserId当APK安装的时候,userid这个标志就会产生。APK在设备上的整个生命周期中,这个ID不再改变。不同设备上同一个应用包可能有不同的userid,重要的是在给定的设备上,每个应用包有自己独立的userid。userid的特点:1. 作为APK身份的标识 2. userid对应一个Linux用户,所以不同APK(用户)间互相访问数据默

好程序员web前端学习路线分享前端基础面试题_好程序员IT的博客-程序员资料

好程序员web前端学习路线分享前端基础面试题,希望对大家有所帮助。1、HTML语义化的理解?答案:HTML语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析;在没有样式CSS的情况下也以一种文档格式显示,并且是容易阅读的;搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于SEO;使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。2、父元素透明,但是又不影响子元素...

随便推点

开发环境上云,打造五星级开发体验_it研发环境上云案例_腾云 CODING的博客-程序员资料

本文作者:王振威 - CODING 研发总监全文约 5000+ 字,预计阅读时间 20 分钟云是从传统 IDC 机房演进而来,一开始云的定位只是为了解决数据中心的弹性计算,高可用等问题。可以说,公有云让成千上万家企业灵活地按需租用数据中心资源成为可能,同时在推动社会数字化发展上起到了关键作用。但简简单单的把云理解为资源的按需租用太狭隘了,随着云技术和行业标准的发展,云原生的概念开始出现。云原生变革了传统应用,传统的应用可以运行在本地开发电脑上,到真正正式提供生产服务才被云以弹性的,高可用的资源提供.

求最短路径-flyod算法_XZ_chAngE的博客-程序员资料

某城市在远郊区新建若干个(假定n个)小区组成的居民区群,各小区之间均有道路互通。现规划在这个居民区的某个小区中建造一所幼儿园(为这n个小区共有)。请为这所幼儿园设计一个选址方案(建在哪个小区),使得离幼儿园最远的小区到幼儿园的路程最短。输入格式:输入的第一行给出小区数目N (1≤N≤10)和道路数目M和1(表示有向图)或0(表示无向图);接下来的M行对应每个小区间的距离,每行给出3个正整数,分别是两个城市的编号(从1编号到N)和小区间的距离。输出格式:输出选定小区的编号。输入样例:3 5 1

Jquery给动态创建的元素绑定事件_相当之稳重的博客-程序员资料

$(selector).bind("click",function(){});   //只能给已有元素绑定事件$(selector).live("click",function(){});   //不论是已有元素还是未来动态添加的元素都可以绑定事件

maven如何导入jar包到本地仓库_lucasma.eth的博客-程序员资料

很多时候通过maven来远程下载jar包,由于网速或者仓库地址问题导致下载失败或者非常缓慢。这时候我们往往会有这样的需求,就是把通过其他手段拿到的jar包安装到本地maven仓库,然后在pom.xml中指定后就可以直接使用了。有哪些途径可以下载maven常用的jar包从别的工程拷贝,我们平时写的项目或者下载的别人项目可能会带有一些常用的jar包,先从这些地方找找。一些常用的网站下载...

centos系统slurm安装_slurm centos_ME_Seraph的博客-程序员资料

文|MESeraph01 | 预先操作关闭Centos界面登录。(仅适用于Centos7以上版本)systemctl get-defaultsystemctl set-default multi-user.target联网(1) 首先查看网卡ls /etc/sysconfig/network-scripts(2) 编辑vi /etc/sysconfig/network-scripts/ifcfg-ensXXXX #我的是ens33修改该文件中配置:ONBOOT=yes(

组合优化问题建模求解方法_faith默默的博客-程序员资料

1、sas 利用sas/OR模块,proc optmodel2、java的组合优化包 http://www.optaplanner.org/learn/documentation.htmlhttp://hao.jobbole.com/optaplanner/ OptaPlanner解决的案例包括车辆路径、雇员排班、云优化、任务调度、装箱问题等。3、R语言解决组合优化问题相关的包 http:/

推荐文章

热门文章

相关标签