Google资深工程师深度讲解Go语言-基础语法(二)「建议收藏」

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

大家好,又见面了,我是全栈君。

视频教程获取地址

一.变量的定义

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”
  • 只能在函数内使用

测试用例代码

package main

import "fmt"

//函数外面定义变量时,必须使用var关键字,不能使用:=
//这些变量作用域,是包内变量,不存在全局变量说法
/*var aa=3
var ss  ="kkk"
var bb  = true*/
var (
	aa = 3
	ss = "kkk"
	bb = true
)

func variableZeroValue() {
	var a int
	var b string
	fmt.Printf("%d %q\n", a, b)
}

//定义变量类型,不能写在一行
func variableIntValue() {
	var a, b int = 3, 4
	var s string = "abc"
	println(a, b, s)
	//fmt.Printf("%d %d %q\n",a,b,s)
}

//省略变量类型,可以写在一行
func varTypeDefValue() {
	var a, b, c, s = 3, 4, true, "abc"
	println(a, b, c, s)
}

//省略var ,第一次定义使用:冒号来定义,第二次定义时使用等号
func variableValueShorter() {
	a, b, c, s := 3, 4, true, "abc"
	b = 5
	println(a, b, c, s)
}
func main() {
	fmt.Println("hello world 33")
	variableZeroValue()
	variableIntValue()
	varTypeDefValue()
	variableValueShorter()
	fmt.Println(aa,bb,ss)
}

结果

hello world 33
0 ""
3 4 abc
3 4 true abc
3 5 true abc
3 true kkk

二.内建变量类型

Google资深工程师深度讲解Go语言-基础语法(二)「建议收藏」Google资深工程师深度讲解Go语言-基础语法(二)「建议收藏」sGoogle资深工程师深度讲解Go语言-基础语法(二)「建议收藏」

  • 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.类型转换是强制的,没有隐士类型转换

package main

import (
	"fmt"
	"math"
	"math/cmplx"
)

func euler() {
	//c:=3+4i
	//fmt.Println(cmplx.Abs(c)) //5
	fmt.Printf("%.3f\n",
		cmplx.Exp(1i*math.Pi)+1) //(0.000+0.000i)

}

func triangle() {
	var a, b int = 3, 4
	var c int
	c = int(math.Sqrt(float64(a*a + b*b)))
	fmt.Println(c) //5 强制类型转换
}
func main() {
	euler()
	triangle()
}

2.变量定义要点:

  • 变量类型写在变量名之后
  • 编译器可推测变量类型
  • 没有char,只有rune
  • 原生支持复数类型
//常量
func consts() {
	//const filename = "abc.txt"
	//const a, b = 3, 4
	const(
	 filename = "abc.txt"
	 a, b = 3, 4
	 )
	var c int

	c = int(math.Sqrt(a*a + b*b))
	fmt.Print(filename, c)

}

//枚举
func enums(){
	/*const  (
		c=0
		java=1
		golang=2
		php=3
	)*/
	const  (
		c=iota  //iota 表示这组是自增值的
		_
		golang
		php
		javascript
	)
//b kb mb gb tb
	const (
		b= 1 <<(10*iota)
		kb
		mb
		gb
		tb
	)
	fmt.Println("\n")
	fmt.Println(c,javascript,golang,php)//0 4 2 3
	fmt.Println(b,kb,mb,gb,tb)//1 1024 1048576 1073741824 1099511627776
}

三.条件语句

if语句

  • if的条件里可以赋值
  • if的条件里赋值的变量作用域就在这个if语句里
const filename = "/Users/liutao/Desktop/vagrant/go/study/day0803/abc.txt"  //注意文件绝对路径
	if contents, err := ioutil.ReadFile(filename);err!=nil{
		fmt.Println(err)
	}else {
		fmt.Printf("%s\n", contents)
	}

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

  • switch会自动break,除非使用fallthrough
  • switch后可以没有表达式
func grade(score int) string {
	g := ""
	switch {
	case score < 0 || score > 100:
		panic(fmt.Sprintf("wrong score: %d", score))
	case score < 60:
		g = "F"
	case score < 80:
		g = "C"
	case score < 90:
		g = "B"
	case score <= 100:
		g = "A"
	default:
	}
	return g
}

//调用
func main() {
	fmt.Println(
	grade(0),
	grade(10),
	grade(59),
	grade(60),
	grade(89),
	grade(100),
	//grade(120), //panic 报错,中止执行
	//grade(-100),
	)
}

//执行结果
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 初始条件,结束条件,递增表达式都不加就是死循环
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func fors() int {
	sum := 0
	for i := 1; i <= 100; i++ {
		sum += i
	}
	return sum
}

//1.省略初始条件,相当于while
func converToBin(n int) string {
	result := ""
	for ; n > 0; n /= 2 {
		lsb := n % 2
		result = strconv.Itoa(lsb) + result //Itoa 转换为字符串
	}
	return result
}

//2.省略初始条件和递增条件
func printile(filename string)  {
	file,err:=os.Open(filename)
	if err!=nil {
		panic(err)
	}
	scanner:=bufio.NewScanner(file)
	//省略初始条件和递增条件
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}

//3.初始条件,结束条件,递增表达式都不加就是死循环 
func forever() string {
	for  {
		fmt.Println("abc")
	}
}

func main() {
	fmt.Println(fors())//5050

	fmt.Println(
		converToBin(5),//101
		converToBin(13),//1101
		converToBin(0),//空串
		)
	//forever()
	printile("/Users/liutao/Desktop/vagrant/go/study/day0803/abc.txt")
}

//执行结果
5050
101 1101 

/**下面文件内容**/
lxw
test
1234
hehh

五.函数

  • 函数返回多个值时,可以起名字
    ​​仅用于非常简单的函数
    对于调用者而言没有区别
    
    返回值类型写在后面(go 变量和返回值都是 名在前,类型在后)
    go可返回多个值,php只能返回一个值(字符串或数组,对象)
    函数作为参数(匿名函数)
    go没有默认参数和可选参数,但有可变参数列表
  • package main
    
    import (
    	"fmt"
    	"math"
    	"reflect"
    	"runtime"
    )
    
    func eval(a, b int, op string) (int, error) {
    	switch op {
    	case "+":
    		return a + b, nil
    	case "-":
    		return a - b, nil
    	case "*":
    		return a * b, nil
    	case "/":
    		//return a / b
    		q, _ := div(a, b)
    		return q, nil
    	default:
    		//panic("unsupported operation:" + op)  //终端执行
    		return 0, fmt.Errorf("unsupported operation: %s", op) //不中断,0 unsupported operation: X
    	}
    }
    
    //多返回值
    func div(a, b int) (q, r int) {
    	return a / b, a % b
    
    }
    
    func apply(op func(int, int) int, a, b int) int {
    	p := reflect.ValueOf(op).Pointer()
    	opName := runtime.FuncForPC(p).Name()
    	fmt.Printf("calling function %s with args"+"(%d,%d)\n", opName, a, b)
    	return op(a, b)
    }
    
    func pow(a, b int) int {
    	return int(math.Pow(float64(a), float64(b)))
    }
    
    //可变参数列表
    func sum(nubers ...int)int{
    	s:=0
    	for i:=range nubers{
    		s+=nubers[i]
    	}
    	return s
    }
    func main() {
    	//fmt.Println(eval(13, 4, "X"))
    	if result, err := eval(13, 4, "X"); err != nil {
    		fmt.Println("error:", err) //error: unsupported operation: X
    	} else {
    		fmt.Println(result)
    	}
    
    	q, r := div(13, 3)
    	fmt.Println(q, r)
    
    	//fmt.Println(apply(pow, 3, 4))
    
    	fmt.Println(apply(
    		func(a int, b int) int {
    			return int(math.Pow(
    				float64(a), float64(b)))
    		}, 3, 4))
    
    	fmt.Println(sum(1,2,3,4,5)) //15
    }

    六.指针

  • 指针不能运算

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

    package main
    
    import "fmt"
    
    //go 语言只有值传递一种方式
    //交换a,b 的值 * 指针类型
    
    //方法一
    /*func swap(a,b *int){
    	*b,*a=*a,*b
    }*/
    
    //方法二
    func swap(a,b int)(int,int)  {
    	return b,a
    }
    func main() {
    	a,b:=3,4
    
    	//方法一
    	//swap(&a,&b)
    	
    	//方法二
    	a,b=swap(a,b)
    	fmt.Println(a,b) //4,3
    }
    

     

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111735.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 一位前辈工程师职业发展的忠告(转自51testing)

    一位前辈工程师职业发展的忠告(转自51testing)

  • JVM的4种垃圾回收算法、垃圾回收机制与总结[通俗易懂]

    JVM的4种垃圾回收算法、垃圾回收机制与总结[通俗易懂]JVM的4种垃圾回收算法、垃圾回收机制与总结-知乎https://zhuanlan.zhihu.com/p/54851319JVM的4种垃圾回收算法、垃圾回收机制与总结一、垃圾回收算法1.标记清除标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段首先通过根节点(GCRoots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。适用场合:…

    2022年10月10日
  • 贪吃蛇穿墙代码_C语言贪吃蛇实现暂停功能

    贪吃蛇穿墙代码_C语言贪吃蛇实现暂停功能文章目录游戏说明游戏效果展示游戏代码游戏代码详解游戏框架构建初始化界面隐藏光标光标跳转颜色设置初始化蛇随机生成食物打印蛇与覆盖蛇移动蛇游戏主体逻辑函数执行按键判断得分与结束从文件读取最高分更新最高分到文件主函数游戏说明游戏效果展示游戏代码游戏代码详解游戏框架构建首先还是先定义一下界面的大小,即界面的行数和列数。#defineROW23//界面行数#defineCOL42//界面列数此外,我们还需要两个结构体,分别用于存储蛇头的信息和蛇身的信息。蛇头结构体当中存储蛇头当前所在

  • 性能调优从哪几个方面入手_cbq是什么意思

    性能调优从哪几个方面入手_cbq是什么意思看了很多的帖子发现很多人都在论坛里写到说CBQ也就是用tc对宽带限速效果不好的论点,其实不是这样的,在后面我们会说到这方面问题怎样解决,但是现在我们还是说点基础知识吧!在对网络宽带进行控制的时候我们通常的选择有两种:CBQ和HTB。

    2022年10月28日
  • word公式编号及交叉引用技巧[通俗易懂]

    word公式编号及交叉引用技巧[通俗易懂]在给word内公式编号时,经常会遇到各种问题,本文记录我应用word时给公式编号及交叉引用的技巧。

    2022年10月23日
  • 12864液晶并行方式显示

    12864液晶并行方式显示

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号