GO学习笔记

  1. 如果我们需要声明不同类型的变量 那么可以按照以下语法声明
var (  
      name1 = initialvalue1
      name2 = initialvalue2
)

https://ytb.dscsdoj.top/

  1. :=语法至少要有一个新的变量
package main

import "fmt"

func main() {  
    a, b := 20, 30 // declare variables a and b
    fmt.Println("a is", a, "b is", b)
    b, c := 40, 50 // b is already declared but c is new
    fmt.Println("b is", b, "c is", c)
    b, c = 80, 90 // assign new values to already declared variables b and c
    fmt.Println("changed b is", b, "c is", c)
}

如果声明的变量都不是新的 就会报错
  1. printf println的区别
    https://blog.csdn.net/zgh0711/article/details/78843361
    需要格式化输出 使用printf 需要输出字符串 变量 就用println
    使用格式化输出占位符 %T 输出变量类型
    unsafe.sizeOf输出变量内存

  2. 浮点数 整数 声明不带位数的话,默认表示为系统位数
    如果你的系统为32位,那么float int 默认为float32 int32
    64位相同

  3. int 代表整数 包括正整数 以及负整数 uint 代表正整数

  4. 浮点数相加相减问题
    原因可看此处https://blog.csdn.net/u010897392/article/details/37878155

  5. 通过T()来强转类型 强转类型必须显性声明类型

package main

import "fmt"

func main() {
    i := 53
    var j float64 = float64(i)
    var k string = string(i)
    fmt.Println(j, k+"324234")
}
  1. 常量必须在编译时已知 不可以被声明为函数 因为函数会在运行时被调用
package main

import (  
    "fmt"
    "math"
)

func main() {  
    fmt.Println("Hello, playground")
    var a = math.Sqrt(4)//allowed
    const b = math.Sqrt(4)//not allowed
}

  1. 单个字符串是一个无类型常量(。。并没有太看懂有什么用意。。。)
const hello = "Hello World"  

无类型常量 “hello world” 分配给了 常量 hello 那么这个常量 还是无类型的

虽然是无类型常量 但是如果使用%T(hello) 那么将输出string 因为无类型常量将在需要时提供一个关联的默认类型 string

  1. 命名返回值

area and perimeter are the named return values in the above function. Note that the return statement in the function does not explicitly return any value. Since area and perimeter are specified in the function declaration as return values, they are automatically returned from the function when a return statement in encountered.

area 和 perimeter 在上面这个函数中都是被命名的返回值。注意这个函数中返回语句并没有指定任何返回值。从area和perimeter被指定为命名返回值时,函数就会返回他们,并且会在函数调用reutrn时自动返回

ps. 这个特性的用意应该是让人更清晰的理解返回值是什么 直接命名返回值的做法比在代码中寻找返回值的变量名来理解更加清晰 当然这应该是注释的功能之一

// 用意应该是注释的这个功能
/**
 * @return { int } area
 * @return { int } perimeter
 */

func rectProps(length int, width int) (area int, perimeter int) { // 直观的理解返回值的意义
  area = length * width // 无需声明变量
  perimeter = (length + width) * 2
  return // 无需显式返回
}

  1. 空白标识符 _

当有多个返回值时, 可以用_来抛弃无用的变量

area3, _ := rectProps(7, 2)
fmt.Println("area %f", area3)
  1. go在windows下的环境变量配置
    go install以及go build命令需要配置好GOBIN以及GOPATH两个环境变量 否则将会报错 找不到GOBIN

  2. 变量可以声明在if语句中

    if num := 10; num % 2 == 0 { //checks if number is even
        fmt.Println(num,"is even") 
    }  else {1. 如果我们需要声明不同类型的变量 那么可以按照以下语法声明

``` GO
var (  
      name1 = initialvalue1
      name2 = initialvalue2
)

https://ytb.dscsdoj.top/

  1. :=语法至少要有一个新的变量
package main

import "fmt"

func main() {  
    a, b := 20, 30 // declare variables a and b
    fmt.Println("a is", a, "b is", b)
    b, c := 40, 50 // b is already declared but c is new
    fmt.Println("b is", b, "c is", c)
    b, c = 80, 90 // assign new values to already declared variables b and c
    fmt.Println("changed b is", b, "c is", c)
}

如果声明的变量都不是新的 就会报错
  1. printf println的区别
    https://blog.csdn.net/zgh0711/article/details/78843361
    需要格式化输出 使用printf 需要输出字符串 变量 就用println
    使用格式化输出占位符 %T 输出变量类型
    unsafe.sizeOf输出变量内存

  2. 浮点数 整数 声明不带位数的话,默认表示为系统位数
    如果你的系统为32位,那么float int 默认为float32 int32
    64位相同

  3. int 代表整数 包括正整数 以及负整数 uint 代表正整数

  4. 浮点数相加相减问题
    原因可看此处https://blog.csdn.net/u010897392/article/details/37878155

  5. 通过T()来强转类型 强转类型必须显性声明类型

package main

import "fmt"

func main() {
    i := 53
    var j float64 = float64(i)
    var k string = string(i)
    fmt.Println(j, k+"324234")
}
  1. 常量必须在编译时已知 不可以被声明为函数 因为函数会在运行时被调用
package main

import (  
    "fmt"
    "math"
)

func main() {  
    fmt.Println("Hello, playground")
    var a = math.Sqrt(4)//allowed
    const b = math.Sqrt(4)//not allowed
}

  1. 单个字符串是一个无类型常量(。。并没有太看懂有什么用意。。。)
const hello = "Hello World"  

无类型常量 “hello world” 分配给了 常量 hello 那么这个常量 还是无类型的

虽然是无类型常量 但是如果使用%T(hello) 那么将输出string 因为无类型常量将在需要时提供一个关联的默认类型 string

  1. 命名返回值

area and perimeter are the named return values in the above function. Note that the return statement in the function does not explicitly return any value. Since area and perimeter are specified in the function declaration as return values, they are automatically returned from the function when a return statement in encountered.

area 和 perimeter 在上面这个函数中都是被命名的返回值。注意这个函数中返回语句并没有指定任何返回值。从area和perimeter被指定为命名返回值时,函数就会返回他们,并且会在函数调用reutrn时自动返回

ps. 这个特性的用意应该是让人更清晰的理解返回值是什么 直接命名返回值的做法比在代码中寻找返回值的变量名来理解更加清晰 当然这应该是注释的功能之一

// 用意应该是注释的这个功能
/**
 * @return { int } area
 * @return { int } perimeter
 */

func rectProps(length int, width int) (area int, perimeter int) { // 直观的理解返回值的意义
  area = length * width // 无需声明变量
  perimeter = (length + width) * 2
  return // 无需显式返回
}

  1. 空白标识符 _

当有多个返回值时, 可以用_来抛弃无用的变量

area3, _ := rectProps(7, 2)
fmt.Println("area %f", area3)
  1. go在windows下的环境变量配置
    go install以及go build命令需要配置好GOBIN以及GOPATH两个环境变量 否则将会报错 找不到GOBIN

  2. 变量可以声明在if语句中

    if num := 10; num % 2 == 0 { //checks if number is even
        fmt.Println(num,"is even") 
    }  else {
        fmt.Println(num,"is odd")
    }
   fmt.Printf("num = %f", num) // error!

但是作用域尽在if语句中
好奇怪的写法

  1. else 语句必须在if语句结束的花括弧同一行, 如果在下一行 就会报错
    if num := 10; num % 2 == 0 { //checks if number is even
        fmt.Println(num,"is even") 
    } 
    else {
        fmt.Println(num,"is odd")
    } // not work!

这是因为GO会自动添加分号

  1. GO只有for循环
  2. break用来停止循环 continue用来跳过本次代码块的执行
  3. break label 用于跳出循环。
  4. for循环的3个组成部分都是可选的
    18.fallthrough 语句将会让switch语句中成功执行的case转移到下一个case 语句
    19 go中的数组拷贝都是浅拷贝 也就是说改变拷贝的值不影响原值 将数组作为参数也是一样
        fmt.Println(num,"is odd")
    }
   fmt.Printf("num = %f", num) // error!

但是作用域尽在if语句中
好奇怪的写法

  1. else 语句必须在if语句结束的花括弧同一行, 如果在下一行 就会报错
    if num := 10; num % 2 == 0 { //checks if number is even
        fmt.Println(num,"is even") 
    } 
    else {
        fmt.Println(num,"is odd")
    } // not work!

这是因为GO会自动添加分号

  1. GO只有for循环
  2. break用来停止循环 continue用来跳过本次代码块的执行
  3. break label 用于跳出循环。
  4. for循环的3个组成部分都是可选的
    18.fallthrough 语句将会让switch语句中成功执行的case转移到下一个case 语句
  5. GO中的数组都是浅拷贝 也就是说改变拷贝的值不影响原值
package main

import (
  "fmt"
)

func main () {
  nums := [3]int{5, 7, 2}
  nums1 := nums
  nums1[0] = 7
  fmt.Println(nums) // [5, 7, 2] // 修改拷贝的值不影响原值
  fmt.Println(nums1) // [7, 7, 2] 
}

  1. GO中的slice属于引用,改变slice将会影响原来的Array 并且可能影响其他的slice
nums2  = nums[0:2] // 请注意 slice是[start : end] start是下标 end是index - 1 
fmt.Println(nums2) // [5, 7]
nums2[1] = 3
fmt.Println(nums2) // [5, 3]
fmt.Println(nums) // [5, 3, 2]
  1. GO中的slice拥有数量和容量的概念
    数量指的是slice的节点数量
    容量值得是slice所引用数组的下标数

fruitArray := [...]string{"23213", "dsfdsf", "dsfrwg", "fregreg", "rgtrjrrhtr"}
fruitSlice := fruitArray[1, 5]
fmt.Println(fruitSlice) // ["dsfdsf", "dsfrwg", "fregreg", "rgtrjrrhtr"]
fmt.Println(len(fruitSlice), cap(fruitSlice)) // 4, 4

  1. slice append 插入原来的切片将返回一个新的数组以及新的切片

  2. 对于一个容量和数量都为0的切片,被称为 nil nil可以使用append函数来填充内容

var names []string // 声明

if names == nill {
  names = append(names, "chen yu", "scscs", "cssss")
}

fmt.Println(names, len(names), cap(names)) // ["chen yu" "scscs" "cssss"] 3, 3
  1. 对于多个切片,你可以用append结合...操作符来合并多个切片
    veggies := []string{"potatoes", "tomatoes", "brinjal"}
    fruits := []string{"oranges", "apples"}
    food := append(veggies, fruits...)
    fmt.Println(food) // [potatoes tomatoes brinjal oranges apples]
  1. slice和array的区别
numbers := [5]int // 数组
numbers1 := []int // 切片
不指定数量的是切片

切片是引用传递
数组是副本

函数传参数组是副本传递
函数传参切片是引用传递

  1. 变量参数 对于 切片参数的优势
  1. 理解可变参数以及切片 引用和拷贝的区别
package main

import (  
    "fmt"
)

func change(s ...string) {  
    s[0] = "Go"
    s = append(s, "playground")
    fmt.Println(s)
}

func main() {  
    welcome := []string{"hello", "world"}
    change(welcome...)
    fmt.Println(welcome)
}

上面的操作中,welcome最终结果是[GO world] 原因是 append函数将会创建一个新的splice 以及其引用的array append函数会拷贝原变量 而不是引用它 而slice参数传递是引用传递 所以改变s参数下标的值 会改变传入的welcome变量

  1. Map类型 如果获取的key不存在,那么value会返回0
amap := map[string]int {
  "qwd": 1
  "fd": 45
  "grg": 466
}

fmt.Println(amap['ffdfff']) // 0
  1. 如果不确定key是否存在与map
    map[key]会返回两个参数
value, ok := map[key]
fmt.Println(value, ok) // 0 false
  1. map和slice一样 也是引用类型

  2. 除非map是nil 否则不可以做比较操作 ==

  3. 指针的类型声明是*T 比如a := *int
    &操作符用来获取内存地址

b := 255
a = &b
fmt.Println(a) // 0xc000012090
  1. interface是一组函数签名
   type MyInterface interface{
       Print()
   } // 定义一个拥有Print函数的interface
   
   func TestFunc(x MyInterface) {}// TestFunc的参数必须是MyInterface类型的 也就是必须拥有Print函数的对象
   type MyStruct struct {} // 声明一个数据结构
   func (me MyStruct) Print() {} // 声明一个基于MyStruct结构的Print函数
   
   func main() {
       var me MyStruct // 初始化一个MyStruct类型的变量
       TestFunc(me) // 将这个变量传参进去,由于MyStruct类型拥有Print函数 所以这段代码正确执行
   }
``'

34.函数传参都是拷贝传参 除了splice map channel是指针传递  可以用指针来进行值传参 

'''
package main

import "fmt"

//简单的一个函数,实现了参数+1的操作
func add1(a int) int {
    a = a+1 // 我们改变了a的值
    return a //返回一个新值
}

func main() {
    x := 3

    fmt.Println("x = ", x)  // 应该输出 "x = 3"

    x1 := add1(x)  //调用add1(x)

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

推荐阅读更多精彩内容

  • 使用go1.10版本,在liteIde里开发。 1,变量声明后必须使用,不然编译不过(全局变量可以不用)。 2,变...
    adrian920阅读 952评论 1 1
  • 变量 var num int;var num int = 1,var a,b int;var a,b int = ...
    明明就_c565阅读 383评论 0 0
  • 生命是笔,生活是画,一笔一笔,画出精致。。。 ——题记 一呼一吸之间我们用行动与智慧实践生命...
    米饭me阅读 277评论 0 0
  • 标题:【30天月度检视】董明轩# 基本情况#姓名:高静宇 年龄:10岁 小组:第3组# 第一阶段30天目标及完成情...
    草原飞雪QUEEN阅读 102评论 0 0
  • 那日路过光启城,看到儿童玩的这个道具,好有新鲜的感觉; 路过马戏城,觉得很有意思,顺道拍下。
    熙溪儿阅读 176评论 0 0