GO语言基础

基础语法

//程序所属包(必须在程序第一行)
package main
//导入依赖包
import  "fmt"
//常量定义
const NAME string = "go"
//全局变量的声明与赋值
var a string = "go"
//一般类型声明
type go int
//结构的声明
type Learn struct {
}
//接口声明
type Ilearn interface {
}
//函数定义
func learnGo() {
    fmt.Print("learnGo")
}
//main()函数
func main() {
    fmt.Print("Hello world!")
}

Package包的用法

  • package是最基本的分发单位和工程管理中依赖关系的体现;
  • 每个GO语言源代码文件开头都拥有一个package声明,表示源码文件所属代码包;
  • 要生成GO语言可执行程序,必须要有main的package包,且必须在该包下有main()函数;
  • 同一路径下只能存在一个package,一个package可以拆成多个源文件组成;

import概念及原理

概念
  • import语句可以导入源代码文件所依赖的package包;
  • 不得导入源代码文件中没有用到的package,否则GO语言编译会报编译错误;
  • import语法格式主要有两种形式:
//第一种
import "package1"
import "package2"
//第二种【推荐】
import(
    "package1"
    "package2"
)
原理
  • 如果一个main导入其他包,包将被顺序导入;
  • 如果导入的包中依赖其他包(包A),会首先导入包A,然后初始化A包中常量和变量,最后如果A包中有int,会自动执行init();
  • 所有包导入完成后才对main中变量和常量进行初始化,然后执行main中的init函数(如果存在),最后执行main函数;
  • 如果一个包被导入多次则该包只会被导入一次;
别名,".","_"的使用
  • 别名
import  "fmt"
import  alias  "fmt"
  • 点(.)操作的含义是:点(.)标识的包导入后,调用该包中函数时可以省略前缀包名【不建议使用点(.),容易造成函数冲突】;
import  .  "fmt"
  • 下划线( _ )操作的含义是:导入该包,但不导入整个包,而是执行该包中的init的函数,因此无法通过包名来调用包中的其他函数。使用下划线( _ )操作往往是为了注册包里的引擎,让外部可以方便的使用;
import  _ "fmt"

数据类型

数值类型
字符串类型
  • 编码统一为"UTF-8"
布尔型
  • 值只可以是常量true和false
派生类型
  • 指针类型(Pointer)
  • 数组类型
  • 结构化类型(struct)
  • Channel类型 (chan)
  • 函数类型 (func)
  • 切片类型 (slice)
  • 接口类型 (interface)
  • Map类型 (map)
类型零值和类型别名
  • 类型零值不是空置,而是某个变量被声明后的默认值,一般情况下,值类型的默认值为0,布尔型默认值为false,字符串类型默认值为空字符串;
var i int32
var j float32
var b bool
var d complex64
  • 我们可以对类型设置别名
//注意:别名类型不能进行运算(相同的别名类型可以
)
type go int32
func main()
{
    var i go
}

类型所占存储大小
数值类型.png

浮点型.png

其他.png

变量

单个变量声明和赋值
  • 声明格式:var <变量名称> [变量类型]
var a int
  • 赋值格式:<变量名称> = <值,表达式,函数等>
a = 1
  • 声明和赋值同时进行:var <变量名称> [变量类型] = <值,表达式,函数等>
var a int = 1
  • 分组声明格式:
var(
    i int
    j float32
    name string
    c int = 1989
)
  • 同一行声明多个变量和赋值;
var a,b,c int = 1,2,3 
var a,b,c = 1,1.2,4
a,b: = 1,2 //简写方式,只能用在函数体内
  • 全局变量的声明必须使用var关键字,局部变量则可以省略;
  • 特殊变量下划线 "_"【可以理解成把这个值丢进垃圾桶,程序运行时不在需要这个值】;
var a,_,c = 11,21.2,4
输出 11,4
变量类型转化
  • Go 中不存在隐式转换,类型转换必须是显示的;
  • 类型转换只能发生在两种兼容类型之间(int和bool是无法转化的);
  • 类型转换格式:<变量名称> [:] = <目标类型> (<需要转换的变量>)【冒号可有可无】
var a int = 3
c := float32(a)
输出:3

var b float32 = 3.01
c := int32(b)
输出:3
转换会有精度的损失
变量可见性规则
  • 大写字母开头的变量是可导出的,也就是其他包可以读取,是公用变量;
  • 小写字母开头的就是不可导出的,是私有变量
var a = "go"
var Learn = "go"

常量

常量定义形式和类型范围
  • 常量定义形式可分为显式和隐式
    1.显式:const identifier [type] = value
    2.隐式:const identifier = value
    (通常叫无类型常量)
const learn string = 'go'
const name = '007'
const(
     learn string = 'go'
     name = '007'
)
const learn,name string = 'go','007'
const a,b  = 1,'go'
  • 常量可以使用内置表达式定义,例如:len(),unsafe.Sizeof()等;
const a,b  = 1,'go'
const alen = len(a)
  • 常量范围目前支持布尔型、数字型(整数型、浮点型和复数)和字符串型;
特殊常量iota的使用
  • iota在const关键字出现时将被重置为0;
const a = iota
const b = iota
输出 0 0
  • const中每新增一行常量声明将使iota计数一次;
const(
    b = iota
    c = iota
)
输出 0 1
  • iota常见使用法:
    1.跳值使用法
    2.插队使用法
    3.表达式隐式使用法
    4.单行使用法
//跳值【使用下划线】
const(
    a = iota
    b = iota
    _
    c = iota
)
输出 0 1 3
//插队
const(
    a = iota
    b = 5.21
    c = iota
)
输出 0 5.21 2
//表达式隐式
const(
    a = iota * 2
    b = iota
    c = iota
)
输出 0 1 2
const(
    a = iota * 2
    b
    c
)
输出 0 2 4
const(
    a = iota * 2
    b = iota * 3
    c
    d
)
输出 0 3 6 9
//单行使用法
const (
    a,b = iota,iota+3
    c,d
    f = iota
    输出 a = 0 b =3 c = 1 d=4 f=2
)

控制语句

  • 条件语句if,if...else,嵌套if,else if;
func main() {
    a := 1
    if a > 0 {
   }
}
  • 选择语句switch,select;
func main() {
   /* 定义局部变量 */
   var grade string = "B"
   var marks int = 90

   switch marks {
      case 90: grade = "A"
      case 80: grade = "B"
      case 50,60,70 : grade = "C"
      default: grade = "D"  
   }

   fmt.Printf("你的等级是 %s\n", grade );      
}
  • 循环语句for;
func main() {
    //无限循环 true可以去掉
    for true  {
        fmt.Printf("这是无限循环。\n");
    }
     //普通循环
     sum := 0
     for i := 0; i <= 10; i++ {
          sum += i
     }
     //类似while
      for sum <= 10{
          sum += sum
      }
     fmt.Println(sum)
     //foreach range循环
     strings := []string{"google", "runoob"}
     for i, s := range strings {
         fmt.Println(i, s)
     }

      numbers := [6]int{1, 2, 3, 5}
      for i,x:= range numbers {
          fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
      } 
      输出结果:
      0 google
      1 runoob
      第 0 位 x 的值 = 1
      第 1 位 x 的值 = 2
      第 2 位 x 的值 = 3
      第 3 位 x 的值 = 5
      第 4 位 x 的值 = 0
      第 5 位 x 的值 = 0 
}

  • goto、break、continue
func main(){
    goto One
    fmt.Print("中间代码")
    One:
        fmt.Print("代码一")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • GO语言结构: 包声明package 引入包import 函数func 变量 语句,表达式 单行注释,多行注释 p...
    SUN_LEON阅读 346评论 0 0
  • title: go语言入门date: 2019-02-12 22:03:27 前言 因项目需要和个人喜好,决定系统...
    dounine阅读 325评论 0 3
  • 一、基本构成 /*1.Go中的注释和C语言中的注释一样, 有多行注释和单行注释所有的注意点, 细节都一样// 从/...
    亨锅锅阅读 247评论 0 1
  • 天变暗了 风呼呼地吹着 蜻蜓成群结队地盘旋 树叶胡乱地飞 飞到走廊边 ...
    孙浒胡阅读 200评论 4 2
  • 大家都知道日语是一种黏着语,助词在日语中起到非常重要的作用。相同的一句话,如果使用的助词不同,句子的含义就会不同,...
    光酱语言研究所阅读 627评论 0 3