Go学习之路(一)变量、常量、数据类型

Go的测试文件写法:
1、源码文件以_test结尾:xxx_test.go
2、测试方法名以 Test 开头:func TestXXX(t *testing.T){...}

Go的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

Go 的 36 个预定义标识符

append bool byte cap close complex complex64 complex128 uint16
copy false float32 float64 imag int int8 int16 uint32
int 32 int64 iota len make new nil panic uint64
print println real recover string true uint uint8 uintptr

Go 的数据类型

  • 布尔型
  • 数字类型
    • 整数型
      • uint8 无符号 8 位整数型(0 到 255)
      • uint16 无符号 16 位整数型(0 到 65535)
      • uint32 无符号 32 位整数型(0 到 4294967295)
      • uint64 无符号 64 位整数型(0 到 18446744073709551615)
      • int8 有符号 8 位整数(-128 到 127)
      • int16 有符号 16 位整数(-32768 到 32767)
      • int32 有符号 32 位整数(-2147483648 到 2147483647)
      • int64 有符号 64 位整数(-923372036854775808 到 923372036854775807)
    • 浮点型
      • float32 IEEE-754 32位浮点型数
      • float64 IEEE-754 64位浮点型数
      • complex64 32 位实数和虚数
      • complex128 64 位实数和虚数
    • 其他数字类型
      • byte 类似 uint8
      • rune 类似 int32
      • uint 32或64位
      • int 与 uint 一样大小
      • uintptr 无符号整型,用于存放一个指针
  • 字符串类型
  • 派生类型
    • 指针类型(Pointer)
    • 数组类型
    • 结构化类型(struct)
    • Channel 类型
    • 函数类型
    • 切片类型
    • 接口类型(interface)
    • Map 类型

Go与其他主要变成语言的差异

  • 赋值可以进行自动类型推断
  • 在一个赋值语句中可以对多个变量进行同时赋值

变量声明方法:

  // 第一种书写方法变量声明   var 变量名 类型 = 值
      var a int = 1  
      var b int = 1
    // 第二种书写方法     这种写法在
    var (
        a int =1
        b int = 1
  )
    
  // 第三种书写方法   这种方法用了go的类型推断,和Python相似
  a :=1
  b :=1
  a,b,c := 1,2,"str"

实现一个小demo
斐波那锲

  package main
  import (
    "fmt"
    "testing"
  )
  func TestFibList(t *testing.T){
    var a int = 1
    var b int = 1
    fmt.Println(a)
    for i :=0; i < 5; i++{
      fmt.Println(" ",b)
      tmp := a
      a = b
      b = tmp + a
     }
    fmt.Println()
  }

交换两个变量的值

func TestExchange(t *testing.T){
  a := 1
  b := 1
  tmp := a
  a = b
  b = tmp  
}
// 第二种方法(这种方法必须是两个变量的类型相同)
a,b = b,a 

_ 实际上是一个只写变量,你不能得到他的值,这样做是因为Go语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。

package main
import "fmt"
func main(){
  numb,_,str1 := numbers()
  fmt.Println(numb,str1)   // 这里如果打印_就会报错
}

func numbers()(int,int,string){     // 这里的第二个括号中是返回的数据类型
  a,b,c := 1,2,"str"
  return a,b,c
}
// 输出结果:
2 str

常量

常量的定义格式:

const identifier [type] = value
const a string = "abc"    // 显示类型定义
const b = "abc"    // 隐式类型定义
// 多个相同类型的声明
const name1,name2 = "abc","ace"

常量名一般默认是全大写
举个栗子:

package main
import "fmt"
func main(){
  const LENGTH int = 10
  const WIDTH int = 5
  var area int
  const a,b,c = 1, false, "str"    // 这个是个多重赋值
  area = LENGTH * WIDTH
  fmt.Printf("面积为 : %d", area)
  println()
  println(a,b,c)
}
// 运行结果
面积为 : 50
1 false str

iota

iota 特殊常量,可以认为是一个可以被编译器修改的常量
iota 在 const 关键字出现时将被重置为0(这个重置为0是在 const 内部的第一行之前,如果是在别的行,那就是恢复为几减一,如const中第七个数,再次出现iota则会恢复为6),const 中每新增一行常量声明将使 iota 计数一次( iota 可以理解成 const 语句块中的行索引)。

// 第一种写法
const(
  a = iota
  b = iota
  c = iota
)
// 第二种写法
const(
  a = iota
  b
  c
)
// 运行结果:
a = 0, b = 1, c = 2

举个栗子:

package main
import "fmt"
func main(){
  const(
    a = iota   // 这里是 0 
    b
    c
    d = "ha"   // 独立值,哈iota没关系,但是iota在这里会+1
    e             // "ha" iota+=1
    f = 100    // 同样是独立值 iota+=1
    g             // 100 iota+=1
    h = iota   // iota 恢复计数
    i
  )
  fmt.Println(a,b,c,d,e,f,g,h,i)
}

Go不支持隐式类型转换

// 错误的例子
package main
import "testing"
func TestImplicit(t *testing.T){
  var a int32 = 1
  var b int64
  b = a
  t.Log(a,b)
}
// 修改上面的错误
package main
import "testing"
func TestImplicit(t *testing.T){
  var a int32 = 1
  var b int64
  b = int64(a)
  t.Log(a,b)
}
// 自写类型
package main
import "testing"
type MyInt int64        // 这个就是自写类型
func TestImplicit(t *testing.T){
  var a int32 = 1
  var b int64
  b = int64(a)
  var c MyInt
  c = MyInt(a)     // 这里自写类型转换
  t.Log(a,b,c)
}

\color{red}{Go不支持任何类型的隐式转换,也不支持元类型的隐式转换}
\color{red}{在Go语言中不支持指针运算}
\color{red}{Go的字符串指类型,他的初始化是空字符串,而不是空}

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

推荐阅读更多精彩内容