Google资深工程师深度讲解Go语言-基础语法(二)

举报
lxw1844912514 发表于 2022/03/27 02:08:13 2022/03/27
【摘要】 视频教程获取地址 一.变量的定义 1.使用var关键字 var a,b,c,boolvar s1,s2 string="hello","world"可放在函数内,或直接放在包内使用var()集中定义变量 2.让编译器自动决定类型 var a,b,i,s1,s2=true,false,3,"hello","world" 3.使用:...

视频教程获取地址

一.变量的定义

1.使用var关键字

  • var a,b,c,bool
  • var s1,s2 string="hello","world"
  • 可放在函数内,或直接放在包内
  • 使用var()集中定义变量

2.让编译器自动决定类型

  • var a,b,i,s1,s2=true,false,3,"hello","world"

3.使用:=定义变量

  • a,b,i,s1,s2:=true,false,3,"hello","world"
  • 只能在函数内使用

测试用例代码


  
  1. package main
  2. import "fmt"
  3. //函数外面定义变量时,必须使用var关键字,不能使用:=
  4. //这些变量作用域,是包内变量,不存在全局变量说法
  5. /*var aa=3
  6. var ss ="kkk"
  7. var bb = true*/
  8. var (
  9. aa = 3
  10. ss = "kkk"
  11. bb = true
  12. )
  13. func variableZeroValue() {
  14. var a int
  15. var b string
  16. fmt.Printf("%d %q\n", a, b)
  17. }
  18. //定义变量类型,不能写在一行
  19. func variableIntValue() {
  20. var a, b int = 3, 4
  21. var s string = "abc"
  22. println(a, b, s)
  23. //fmt.Printf("%d %d %q\n",a,b,s)
  24. }
  25. //省略变量类型,可以写在一行
  26. func varTypeDefValue() {
  27. var a, b, c, s = 3, 4, true, "abc"
  28. println(a, b, c, s)
  29. }
  30. //省略var ,第一次定义使用:冒号来定义,第二次定义时使用等号
  31. func variableValueShorter() {
  32. a, b, c, s := 3, 4, true, "abc"
  33. b = 5
  34. println(a, b, c, s)
  35. }
  36. func main() {
  37. fmt.Println("hello world 33")
  38. variableZeroValue()
  39. variableIntValue()
  40. varTypeDefValue()
  41. variableValueShorter()
  42. fmt.Println(aa,bb,ss)
  43. }

结果


  
  1. hello world 33
  2. 0 ""
  3. 3 4 abc
  4. 3 4 true abc
  5. 3 5 true abc
  6. 3 true kkk

二.内建变量类型

s

  • bool string
  • (u)int (u)int8 (u)int16,   (u)int32,(u)int64, uintptr 指针  加u无符号证书,不加u有符号整数,根据操作系统分,规定长度,不规定长度
  • byte rune 字符型,go语言的char类型,byte 8位,rune 32位
  • float32,float64,complex64,complex128 复数类型,complex64 的实部和虚部都是float32,complex128 实部和虚部都是float64

1.类型转换是强制的,没有隐士类型转换


  
  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. "math/cmplx"
  6. )
  7. func euler() {
  8. //c:=3+4i
  9. //fmt.Println(cmplx.Abs(c)) //5
  10. fmt.Printf("%.3f\n",
  11. cmplx.Exp(1i*math.Pi)+1) //(0.000+0.000i)
  12. }
  13. func triangle() {
  14. var a, b int = 3, 4
  15. var c int
  16. c = int(math.Sqrt(float64(a*a + b*b)))
  17. fmt.Println(c) //5 强制类型转换
  18. }
  19. func main() {
  20. euler()
  21. triangle()
  22. }

2.变量定义要点:

  • 变量类型写在变量名之后
  • 编译器可推测变量类型
  • 没有char,只有rune
  • 原生支持复数类型

  
  1. //常量
  2. func consts() {
  3. //const filename = "abc.txt"
  4. //const a, b = 3, 4
  5. const(
  6. filename = "abc.txt"
  7. a, b = 3, 4
  8. )
  9. var c int
  10. c = int(math.Sqrt(a*a + b*b))
  11. fmt.Print(filename, c)
  12. }
  13. //枚举
  14. func enums(){
  15. /*const (
  16. c=0
  17. java=1
  18. golang=2
  19. php=3
  20. )*/
  21. const (
  22. c=iota //iota 表示这组是自增值的
  23. _
  24. golang
  25. php
  26. javascript
  27. )
  28. //b kb mb gb tb
  29. const (
  30. b= 1 <<(10*iota)
  31. kb
  32. mb
  33. gb
  34. tb
  35. )
  36. fmt.Println("\n")
  37. fmt.Println(c,javascript,golang,php)//0 4 2 3
  38. fmt.Println(b,kb,mb,gb,tb)//1 1024 1048576 1073741824 1099511627776
  39. }

三.条件语句

if语句

  • if的条件里可以赋值
  • if的条件里赋值的变量作用域就在这个if语句里

  
  1. const filename = "/Users/liutao/Desktop/vagrant/go/study/day0803/abc.txt" //注意文件绝对路径
  2. if contents, err := ioutil.ReadFile(filename);err!=nil{
  3. fmt.Println(err)
  4. }else {
  5. fmt.Printf("%s\n", contents)
  6. }

 switch  panic作用:终端程序执行,并报错

  • switch会自动break,除非使用fallthrough
  • switch后可以没有表达式

  
  1. func grade(score int) string {
  2. g := ""
  3. switch {
  4. case score < 0 || score > 100:
  5. panic(fmt.Sprintf("wrong score: %d", score))
  6. case score < 60:
  7. g = "F"
  8. case score < 80:
  9. g = "C"
  10. case score < 90:
  11. g = "B"
  12. case score <= 100:
  13. g = "A"
  14. default:
  15. }
  16. return g
  17. }
  18. //调用
  19. func main() {
  20. fmt.Println(
  21. grade(0),
  22. grade(10),
  23. grade(59),
  24. grade(60),
  25. grade(89),
  26. grade(100),
  27. //grade(120), //panic 报错,中止执行
  28. //grade(-100),
  29. )
  30. }
  31. //执行结果
  32. F F F C B A

四.循环

要点:

  1. for,if后面的条件没有括号
  2. if条件里也可以定义变量
  3. 没有while
  4. switch不需要break,也可以直接switch多个条件

for 语句

  • for的条件里不需要括号
  • for的条件里可以省略初始条件,结束条件,递增表达式
  • for省略初始条件,相当于while
  • for省略初始条件和递增条件,相当于while
  • for 初始条件,结束条件,递增表达式都不加就是死循环

  
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. )
  8. func fors() int {
  9. sum := 0
  10. for i := 1; i <= 100; i++ {
  11. sum += i
  12. }
  13. return sum
  14. }
  15. //1.省略初始条件,相当于while
  16. func converToBin(n int) string {
  17. result := ""
  18. for ; n > 0; n /= 2 {
  19. lsb := n % 2
  20. result = strconv.Itoa(lsb) + result //Itoa 转换为字符串
  21. }
  22. return result
  23. }
  24. //2.省略初始条件和递增条件
  25. func printile(filename string) {
  26. file,err:=os.Open(filename)
  27. if err!=nil {
  28. panic(err)
  29. }
  30. scanner:=bufio.NewScanner(file)
  31. //省略初始条件和递增条件
  32. for scanner.Scan() {
  33. fmt.Println(scanner.Text())
  34. }
  35. }
  36. //3.初始条件,结束条件,递增表达式都不加就是死循环
  37. func forever() string {
  38. for {
  39. fmt.Println("abc")
  40. }
  41. }
  42. func main() {
  43. fmt.Println(fors())//5050
  44. fmt.Println(
  45. converToBin(5),//101
  46. converToBin(13),//1101
  47. converToBin(0),//空串
  48. )
  49. //forever()
  50. printile("/Users/liutao/Desktop/vagrant/go/study/day0803/abc.txt")
  51. }
  52. //执行结果
  53. 5050
  54. 101 1101
  55. /**下面文件内容**/
  56. lxw
  57. test
  58. 1234
  59. hehh

五.函数

  • 
        
    1. 函数返回多个值时,可以起名字
    2. ​​仅用于非常简单的函数
    3. 对于调用者而言没有区别
    4. 返回值类型写在后面(go 变量和返回值都是 名在前,类型在后)
    5. go可返回多个值,php只能返回一个值(字符串或数组,对象)
    6. 函数作为参数(匿名函数)
    7. go没有默认参数和可选参数,但有可变参数列表
  • 
        
    1. package main
    2. import (
    3. "fmt"
    4. "math"
    5. "reflect"
    6. "runtime"
    7. )
    8. func eval(a, b int, op string) (int, error) {
    9. switch op {
    10. case "+":
    11. return a + b, nil
    12. case "-":
    13. return a - b, nil
    14. case "*":
    15. return a * b, nil
    16. case "/":
    17. //return a / b
    18. q, _ := div(a, b)
    19. return q, nil
    20. default:
    21. //panic("unsupported operation:" + op) //终端执行
    22. return 0, fmt.Errorf("unsupported operation: %s", op) //不中断,0 unsupported operation: X
    23. }
    24. }
    25. //多返回值
    26. func div(a, b int) (q, r int) {
    27. return a / b, a % b
    28. }
    29. func apply(op func(int, int) int, a, b int) int {
    30. p := reflect.ValueOf(op).Pointer()
    31. opName := runtime.FuncForPC(p).Name()
    32. fmt.Printf("calling function %s with args"+"(%d,%d)\n", opName, a, b)
    33. return op(a, b)
    34. }
    35. func pow(a, b int) int {
    36. return int(math.Pow(float64(a), float64(b)))
    37. }
    38. //可变参数列表
    39. func sum(nubers ...int)int{
    40. s:=0
    41. for i:=range nubers{
    42. s+=nubers[i]
    43. }
    44. return s
    45. }
    46. func main() {
    47. //fmt.Println(eval(13, 4, "X"))
    48. if result, err := eval(13, 4, "X"); err != nil {
    49. fmt.Println("error:", err) //error: unsupported operation: X
    50. } else {
    51. fmt.Println(result)
    52. }
    53. q, r := div(13, 3)
    54. fmt.Println(q, r)
    55. //fmt.Println(apply(pow, 3, 4))
    56. fmt.Println(apply(
    57. func(a int, b int) int {
    58. return int(math.Pow(
    59. float64(a), float64(b)))
    60. }, 3, 4))
    61. fmt.Println(sum(1,2,3,4,5)) //15
    62. }

    六.指针

  • 指针不能运算

  •  go语言只有值传递一种方式

    
        
    1. package main
    2. import "fmt"
    3. //go 语言只有值传递一种方式
    4. //交换a,b 的值 * 指针类型
    5. //方法一
    6. /*func swap(a,b *int){
    7. *b,*a=*a,*b
    8. }*/
    9. //方法二
    10. func swap(a,b int)(int,int) {
    11. return b,a
    12. }
    13. func main() {
    14. a,b:=3,4
    15. //方法一
    16. //swap(&a,&b)
    17. //方法二
    18. a,b=swap(a,b)
    19. fmt.Println(a,b) //4,3
    20. }

     

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/107772010

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。