go 基础

变量的定义

    注意:
    变量必须先定义后使用
    go 语言是静态语言,要求变量的类型和赋值类型一致
    局部变量名字不能冲突;局部变量可以和全局变量重名优先级局部变量高
    简洁变量定义必须是在函数内
    定义变量后未赋值都有默认值(零值)
    局部变量定义后一定要使用否则报错
package main

import "fmt"
//全局变量
var t = "s"
var  (
	s = 8
	o = false
)

func main() {
	//go定义
	var a int = 1
	a1 := "string"
	var a2 string
	a2 = "s"
	fmt.Println(a)
	fmt.Println(a1)
	fmt.Println(a2)
	var w1,w2,w3 ="r",5,"t"
	fmt.Println(w1,w2,w3)
	/*
	注意:
	变量必须先定义后使用
	go 语言是静态语言,要求变量的类型和赋值类型一致
	局部变量名字不能冲突;局部变量可以和全局变量重名优先级局部变量高
	简洁变量定义必须是在函数内
	定义变量后未赋值都有默认值(零值)
	局部变量定义后一定要使用否则报错
	*/

}
执行结果
PS D:\golang\goproject\src\lnhgo> go run d:\golang\goproject\src\lnhgo\day01\main.go
1
string
s
r 5 t

  常量定义

    常量类型可以定义为bool、数值、和字符串
    不曾使用的常量没有强制使用的要求
    显示指定类型的时候,必须保证常量左右值类型一致
    如果常量没有定义值,那会沿用它场面常量的值
package main
import (
	"fmt"
)
func main(){
	//常量:定义的时候指定值,不能修改,常量全部大写
	const PI float32 = 3.1415926//显示定义
	// 定义一组
	const (
		UNKNOWN = 1
		FMMALE=2
		MALE= 3
	)
	const(
		X int = 6
		C //如果常量没有定义值,那会沿用它场面常量的值
		S  = "sa"
		D 
	)
	fmt.Println(X,C,S,D)
	/*
	常量类型可以定义为bool、数值、和字符串
	不曾使用的常量没有强制使用的要求
	显示指定类型的时候,必须保证常量左右值类型一致
	如果常量没有定义值,那会沿用它场面常量的值

	*/

}

执行结果
PS D:\golang\goproject\src\lnhgo> go run d:\golang\goproject\src\lnhgo\day01\demo02\main.go
6 6 sa sa

  iota 的介绍

package main
import(
	"fmt"
)
func main() {
	/* iota,特色常量可以被编译器修改的常量
	| 常量名   | iota值 | 表达式    | 结果   |
	| ----- | ----- | ------ | ---- |
	| ERR1  | 0     | iota+1 | 1    |
	| ERR2  | 1     | iota+1 | 2    |
	| ERR25 | 2     | "ha"   | "ha" |
	| ERR4  | 3     | "ha"   | "ha" |
	| ERR42 | 4     | "ha"   | "ha" |
	| ERR5  | 5     | iota   | 5    |
	显示恢复后续自增;自增类型默认int类型
	iota能简化const类型的变量
	每次出现const 的时候iota 就归0

	
	*/
	const (
		ERR1 = iota+1//iota=0 -> 1
		ERR2 //iota=0 -> 1
		ERR25 = "ha"//iota=2
		ERR4 //复制上一行表达式
		ERR42//复制上一行表达式
		ERR45=100//iota5
		ERR5 = iota//显示恢复后续自增

	)
	const (
		ERRNEW1=iota //从0开始
	)

	fmt.Println(ERR1,ERR2,ERR25,ERR4,ERR5)
	fmt.Println(ERRNEW1)
}
执行结果
1 2 ha ha 6
0

  匿名变量

package main

import "fmt"

func a() (int, bool) {
	return 0, true
}
func main() {
	//
	var _ int
	_, r := a()//匿名变量使用场景;占位符_
	if r {
		fmt.Println("a")
	}

}

  变量的作用域

1. 局部变量(Local Variable)定义在函数内部,只能在函数内使用。下面变量只能在 main() 里使用。

package main

import "fmt"

func main() {
    age := 18
    fmt.Println(age)
}
结果
18

2. 全局变量(Global Variable)定义在函数外面。整个包(package)内都可以访问。

var age = 18

func main() {
    fmt.Println(age)
}

func test() {
    fmt.Println(age)
}

  3.块作用域(Block Scope)由 {} 形成。

func main() {
    x := 10

    if true {
        y := 20
        fmt.Println(x)
        fmt.Println(y)
    }

    fmt.Println(x)
    // fmt.Println(y) // 报错
}

  Go 最容易踩坑的地方:变量遮蔽(Shadowing)

func main() {
    x := 10

    {
        x := 20
        fmt.Println(x)
    }

    fmt.Println(x)
}
执行结果
20
10

  go基本数据类型

go 基本数据类型
bool(布尔):布尔型的值只有true和false。例子:var b bool = true
数值型:
(1)整数:
int8:有符号8位整型(-128~127)长度8bit
int16:有符号16位整型(-32768~32767)
int32:有符号32位整型(-2147483648~2147483647)
int64:有符号64位整型(-9223372036854775808~-9223372036854775807)
uint8: 无符号8位整型(0~255)
uint16:无符号16位整型(0~65535)
uint32: 无符号32位整型(0~4294967295)
uint64: 无符号64位整型(0~18446744073709551615)
(2)浮点数:
float32: 32位浮点型
float64: 64位浮点型
(3)复数:
(4)byte字节:等于uint8
(5)rune型:等于uint32
(6)字符和string

package main
import(
	"fmt"
)
func main(){
	var c byte//只要存英文字符
	c = 'a'+1 //也是字符可以汉字
	fmt.Printf("c=%c\n",c)
	var c2 rune
	c2 = '熙'
	fmt.Printf("c2=%c\n",c2)
	var name string 
	name = "亚马逊"
	fmt.Println(name)
}
执行结果
PS D:\golang\goproject\src\lnhgo> go run d:\golang\goproject\src\lnhgo\day01\demo06\main.go
c=b
c2=熙
亚马逊

  数据类型转换

package main

import (
	"fmt"
	"strconv"
	//"main"
)
func main(){
	//浮点数
	a:=5.5
	//转换为int
	b:=int(a)//5
	//Go允许在底层结构相同的两个数据类型之间互转,例如:
	//IT类型的底层是int类型
	type IT int
	var a3 IT = 5
	//将a(IT)转换为int,b现在是int类型
	c := int(a)
	var a1 int32 = 1
	var a2 int64 = 1
	b1 := int64(a1)
	fmt.Println(a,a1,a2,a3,b,b1,c)
	//字符串转数字
	var istr="12"
	t,_:=strconv.Atoi(istr)//有可能错误
	fmt.Println(t)
	var my= 32
	d:=strconv.Itoa(my)
	fmt.Println(d)
	//字符串转flaot32类型。字符串转bool类型
	f1,_:=strconv.ParseFloat("3.14567",32)//参数里填写64或32返回的值都是float64,参数作用是按照64或32为格式转换;返回两个值
	fmt.Println(f1)
	//字符串转数字方式2
	i1,_:=strconv.ParseInt("-45",10,64)//参数字符串:指定转换的进制(这里指定为10进制);转为多少位
	fmt.Println(i1)
	i2,_:=strconv.ParseInt("54",8,16)
	fmt.Println(i2)
	//字符串转布尔;ParseBool 函数返回字符串所表示的布尔值。它接受的值包括 1、t、T、TRUE、true、True、0、f、F、FALSE、false 和 False。任何其他值都会返回错误。
	b2,err := strconv.ParseBool("t")
	if err !=nil{
		fmt.Println("转换失败")
		return
	}
	fmt.Println(b2)
	//基本数据类型转字符串
	b3:=strconv.FormatBool(true)
	fmt.Println(b3)
	f2:=strconv.FormatFloat(3.1415926,'E',-1,64)
	fmt.Println(f2)
	i3:=strconv.FormatInt(-42,16)//16表示16进制
	fmt.Println(i3)

}
执行结果
5.5 1 1 5 5 1 5
12
32
3.145669937133789
-45
44
true
true
3.1415926E+00
-2a

  运算符表达式

package main

import (
	"fmt"
	//"runtime/trace"
)
func main(){
	var a,b = 2,3
	var astr,bstr = "hello","bobby"
	fmt.Println(a+b)
	fmt.Println(astr+bstr)
	fmt.Println(3%2)
	var abool,bbool = true,false
	if abool&&bbool{
		fmt.Println("a")
	}
	if abool||bbool{
		fmt.Println("b")
	}
	if !abool{
		fmt.Println("s")
	}
	//位运算符,性能要求高考虑
	var A = 60
	var B = 13
	fmt.Println(A&B)
}
执行结果
5
hellobobby
1
b
12

  转义符

转义符
\n:换行,将当前位置移到下一行开头 010
\r:回车,将当前位置移到本行开头 013
\t:水平制表符 009
\\:代码一个反斜线 092
\':代表一个单引号字符 039
\":代表一个双引号 034
\?:代表一个问号 043

  格式化输出

转义符
\n:换行,将当前位置移到下一行开头 010
\r:回车,将当前位置移到本行开头 013
\t:水平制表符 009
\\:代码一个反斜线 092
\':代表一个单引号字符 039
\":代表一个双引号 034
\?:代表一个问号 043


缺省格式和类型
格式化后的效果      动词        描述
[0 1]               %v          缺型格式
[]int{0,1}          %#v         go语法打印
[]int64             %T          类型打印
整型缩进(缩进,进制类型,正负符号)
格式化后的效果      动词        描述
15                  %d         十进制
+15                 %+d        必须显示正负符号
_15                 %4d         pad空格(宽度为4,右对齐)
15_                 %-4d        pad空格(宽度为4,左对齐)
1111                %b          二进制
17                  %o          八进制
f                   %x          16进制,小写
字符(有引号,Unicode)
value:65(Unicode)
格式化后的效果      动词        描述
A                   %c          字符
'A'                 %q          有引号字符
U+0041              %U          Unicode
U+0041'A'           %#U         Unicode引号
浮点(缩进,精度,科学计数)
格式化后的效果      动词        描述
1.234560e+02        %e          科学计数
123.456000          %f          十进制小数
字符串or字节slice(引号,缩进,十六进制)
格式化后的效果      动词        描述
cafe                %s          字符串原样输出
_cafe               %6s         宽度为6,右对齐

  字符串格式化输出性能最高的方式:strings.Builder

package main

import (
	"fmt"
	"strconv"
	"strings"
)
func main(){
	name := "imooc体系"
	bytes := []rune(name)
	fmt.Println(len(bytes))
	//格式化输出
	username:="bobby"
	age := 18
	address :="北京"
	mobile := "1857656899"
	fmt.Printf("用户名:%s,年龄:%d,地址:%s,电话:%s\n",username,age,address,mobile)//极难维护
	usrMsg:=fmt.Sprintf("用户名:%s,年龄:%d,地址:%s,电话:%s",username,age,address,mobile)//
	fmt.Println(usrMsg)
	//通过string的builder进行字符串拼接,高性能
	var builder strings.Builder
	builder.WriteString("用户名:")
	builder.WriteString(username)
	builder.WriteString(",年龄:")
	builder.WriteString(strconv.Itoa(age))
	builder.WriteString(",地址:")
	builder.WriteString(address)
	builder.WriteString(",电话:")
	builder.WriteString(mobile)
	fmt.Println(builder.String())
}
执行结果
7
用户名:bobby,年龄:18,地址:北京,电话:1857656899
用户名:bobby,年龄:18,地址:北京,电话:1857656899
用户名:bobby,年龄:18,地址:北京,电话:1857656899

  字符串比较

package main
import (
	"fmt"
)
func main(){
	//字符串比较
	a:="hello"
	b:="bello"
	fmt.Println(a==b)
	fmt.Println(a!=b)
	//字符串大小比较
	fmt.Println(a>b)
	

}
执行结果
PS D:\golang\goproject\src\lnhgo> go run day01\demo10\main.go
false
true
true

  字符串常用方法

 

 

package main

import (
	"fmt"
	"strings"
	"unicode/utf8"
)
func main(){
	name:="imooc体系课-go工程师go"
	//是否包含
	fmt.Println(strings.Contains(name,"go"))
	//字符串长度
	//len() 统计的是:字节数(byte)而不是字符数。汉字使用UTF-8编码,UTF-8 占 3 个字节
	fmt.Println(len(name))
	//统计字符个数(包含汉字)使用 utf8.RuneCountInString
	fmt.Println(utf8.RuneCountInString(name))
	//查询子串出现的次数
	fmt.Println(strings.Count(name,"o"))
	//分隔
	fmt.Println(strings.Split(name,"-"))
	//字符串是否指定的前缀开头
	fmt.Println(strings.HasPrefix(name,"im"))
	//字符串是否以指定的内容结尾
	fmt.Println(strings.HasSuffix(name,"师"))
	//查询子串出现的位置
	fmt.Println(strings.Index(name,"go"))
	//查询子串出现的位置
	fmt.Println(strings.IndexRune(name,[]rune(name)[8]))
	//子串替换-1表示全部替换整数表示替换几个
	fmt.Println(strings.Replace(name,"go","python",-1))
	//转换成小写
	fmt.Println(strings.ToLower("GO"))
	//转换成大写
	fmt.Println(strings.ToUpper(name))
	//去掉字符串左右两边特舒字符
	fmt.Println(strings.Trim("*$hello *go*","*$"))
}

执行结果
true
28
16
4
[imooc体系课 go工程师go]
true
false
15
14
imooc体系课-python工程师python
go
IMOOC体系课-GO工程师GO
hello *go

  if 条件判断

package main
import (
	"fmt"
)
func main(){
	//if判断
	age:=22
	if age<18{
		fmt.Println("未成年")
	}else{
		fmt.Println("成年")
	}
	if age<18{
		fmt.Println("未成年")
	}else if age>60{
		fmt.Println("老年人")
	}else{
		fmt.Println("青年")
	}
}

执行结果
成年
青年

  for 循环与for 死循环

package main

import (
	"fmt"
	//"path"
	"time"
)
func main(){
	for i:=0;i<3;i++{
		fmt.Println(i)
	}
	var i int
	for  {//死循环

		time.Sleep(2*time.Second)
		fmt.Println(i)
		i++
	}
}

  用循环求1~100的和

package main
import(
	"fmt"
)
func main(){
	var sun int
	for i:=1;i<=100;i++{
		sun+=i
		//fmt.Println(i,sun)
	}
	fmt.Println(sun)
}
执行结果
5050

  九九乘法表

package main
import(
	"fmt"
)
func main(){

	for i:=1;i<10;i++{
		for x:=1;x<=i;x++{
			fmt.Printf("%d * %d = %d\t",x,i,x*i)
		}
		fmt.Println()
	}
}
执行结果
1 * 1 = 1
1 * 2 = 2       2 * 2 = 4
1 * 3 = 3       2 * 3 = 6       3 * 3 = 9
1 * 4 = 4       2 * 4 = 8       3 * 4 = 12      4 * 4 = 16
1 * 5 = 5       2 * 5 = 10      3 * 5 = 15      4 * 5 = 20      5 * 5 = 25
1 * 6 = 6       2 * 6 = 12      3 * 6 = 18      4 * 6 = 24      5 * 6 = 30      6 * 6 = 36
1 * 7 = 7       2 * 7 = 14      3 * 7 = 21      4 * 7 = 28      5 * 7 = 35      6 * 7 = 42      7 * 7 = 49
1 * 8 = 8       2 * 8 = 16      3 * 8 = 24      4 * 8 = 32      5 * 8 = 40      6 * 8 = 48      7 * 8 = 56      8 * 8 = 64
1 * 9 = 9       2 * 9 = 18      3 * 9 = 27      4 * 9 = 36      5 * 9 = 45      6 * 9 = 54      7 * 9 = 63      8 * 9 = 72      9 * 9 = 81

  forrange 循环

package main
import(
	"fmt"
)
func main(){
	//字符串遍历
	name :="imooc go python 课程"
	for v,k:=range name{
		fmt.Printf("%d=%c\t",v,k)
	}
}



执行结果
PS D:\golang\goproject\src\lnhgo> go run day01\demo13\main.go
0=i     1=m     2=o     3=o     4=c     5=      6=g     7=o     8=      9=p     10=y    11=t    12=h    13=o    14=n    15=     16=课   19=程

  continue:跳出此次循环开启下次循环;break:结束循环

package main
import(
	"fmt"
)
func main(){
	r:=10
	for {
		r--
		if r == 5{
			continue// 接收本次循环;继续下次循环
		}else if r==0{
			fmt.Println(r)
			break //退出循环
		}
		fmt.Println(r)
		
	}
}
执行
9
8
7
6
4
3
2
1
0

  goto 语句

package main
import(
	"fmt"
)
func main(){
	r:=10
	for {
		r--
		if r == 5{
			goto t1//直接跳转到t1标签语句哪里
		}else if r==0{
			fmt.Println(r)
			break //退出循环
		}
		fmt.Println(r)
		
	}
	t1://标签
	fmt.Println("goto 标签")
}
执行结果
PS D:\golang\goproject\src\lnhgo> go run day01\demo13\main.go
9
8
7
6
goto 标签

  switch 语法

package main
import(
	"fmt"
)
func main(){
	var n int 
	fmt.Printf("输入选择")
	fmt.Scanln(&n)
	switch n{
	case 1:
		fmt.Println("大拇指")
	case 2:
		fmt.Println("食指")
	case 3:
		fmt.Println("中指")
	case 4:
		fmt.Println("无名指")
	case 5:
		fmt.Println("小拇指")
	default:
		fmt.Println("输入不正确")
	}
}
执行结果
PS D:\golang\goproject\src\lnhgo> go run day01\demo13\main.go
输入选择3
中指
PS D:\golang\goproject\src\lnhgo> go run day01\demo13\main.go
输入选择4
无名指
PS D:\golang\goproject\src\lnhgo> go run day01\demo13\main.go
输入选择6
输入不正确

  示例2

package main
import(
	"fmt"
)
func main(){
	var t int 
	fmt.Printf("输入分数:")
	fmt.Scanln(&t)
	switch {
	case t==100:
		fmt.Println("卓越")
	case t>90:
		fmt.Println("优秀")
	case t>80:
		fmt.Println("好")
	case t>70:
		fmt.Println("良")
	case t>60 && t==60:
		fmt.Println("及格")
	default:
		fmt.Println("不及格,继续努力")
	}
}
执行结果
PS D:\golang\goproject\src\lnhgo> go run day01\demo13\main.go
输入分数:60
不及格,继续努力
PS D:\golang\goproject\src\lnhgo> go run day01\demo13\main.go
输入分数:78
良
PS D:\golang\goproject\src\lnhgo> go run day01\demo13\main.go
输入分数:95
优秀
PS D:\golang\goproject\src\lnhgo> go run day01\demo13\main.go
输入分数:100
卓越

  

 

 

 

posted @ 2026-06-09 14:04  烟雨楼台,行云流水  阅读(5)  评论(0)    收藏  举报