GO 语言学习

juxuny · · 1989 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。




安装:

sudo apt-get installgolang-go

export GOROOT=$HOME/go

exportPATH=$PATH:$GOROOT/bin



一,hello world 程序

package main //这个包的名称

import “fmt” //包含 “fmt”,fmt里有输入输出

func main(){
fmt.Printf(“Hello world!\n”);
}


注意: main()函数,大括号“{”要跟函数名同一行,如果像c语言那样,编译器会报错的。


编译:

go build a.go

这里的a.go是源文件名


二 使用hash

package main 
import ( 
		"fmt" 
		) 

type Data struct{ 
	date string; 
	value int; 
} 

func main() { 
	fmt.Printf("hello world!\n"); 
	var m = make(map[string]int); //创建一个空白的hash
	m["str1"] = 10; 
	m["str2"] = 1000; 
	fmt.Printf("%d\n",m["str1"]); 
	// 遍历 hash
	for name,value := range m { 
		fmt.Printf("%s\t%d\n",name,value); 
	} 
}



三 赋值语句特点

googledocument引用:

Multipleassignment

Thelanguage specification has long guaranteed that in assignments theright-hand-side expressions are all evaluated before anyleft-hand-side expressions are assigned. To guarantee predictablebehavior, Go 1 refines the specification further.

Ifthe left-hand side of the assignment statement contains expressionsthat require evaluation, such as function calls or array indexingoperations, these will all be done using the usual left-to-right rulebefore any variables are assigned their value. Once everything isevaluated, the actual assignments proceed in left-to-right order.

Theseexamples illustrate the behavior.

    sa := []int{1, 2, 3}
    i := 0
    i, sa[i] = 1, 2 // sets i = 1, sa[0] = 2

    sb := []int{1, 2, 3}
    j := 0
    sb[j], j = 2, 1 // sets sb[0] = 2, j = 1

    sc := []int{1, 2, 3}
    sc[0], sc[0] = 1, 2 // sets sc[0] = 1, then sc[0] = 2 (so sc[0] = 2 at end)

Updating:This is one change where tools cannot help, but breakage is unlikely.No code in the standard repository was broken by this change, andcode that depended on the previous unspecified behavior was alreadyincorrect.


四 函数定义与使用


package main 
import ( 
		"fmt" 
		) 

//  (x int) 是参数表
// (r int) 是返回结果
func fun(x int)(r int){ 
	if x == 1 { 
		return 1; 
	}else { 
		return fun(x -1 ) * x; 
	} 
	return ; 
} 

func main() { 
	fmt.Printf("%d\n",fun(3)); 
}




五 常量与变量

package main 
import ( 
		"fmt" 
		"os" 
		) 


const pi = 3.14; // 定义一个常变量
const pp = 2/3; 

func main() { 
	var a int = 10; //定义一个整型变量,并初始化为 10
	var goos = os.Getenv("PATH"); //获取系统环境变量
	fmt.Printf("%s\n",goos); 
	fmt.Printf("%f\n%d\n",pi,pp); 
	fmt.Printf("%d\n",a); 
}






Time Savers : Short Declarations andDistributing

之前定义一个变量方法:

var a int = 10;

为了节约时间,我们可以定义如下:

a := 10;

系统会根据数值的类型定义a这个变量



七基本数据类型

number :

int ,uint ,float ,uintptr



The uintptr data type is a special data typethat is an

unsigned integer that will be large enoughto store a pointer

value.



int ,uint ,float 的长度是根据平台而定的,如果是64bit平台,intuint长度就是64bit,如果是32 bit平台,它的长度就是32bit

The architecture-independent numeric typesare:

uint8

uintl6

uint32

uint64

int8

intl6

int32

int64

float32

float64

byteThebyte is a familiar alias for uint8.



NOTE:

{

var a int8 = 10;

var b int16 = 100;

b = a ;

}



This program will generate a compiler error:

cannot use rny16bitint (type int16) as

type int32 in assignment



string :

var str string ;//定义

str = “abcdeft”;

fmt.Printf(str);//输出

str[0] 是‘a’index0开始



八 使用strings

strings.HasPrefix(strstring, prefix string) bool;//判断是否有前缀prefix
strings.HasSuffix(strstring, suffix string) bool;//判断是否有后缀suffix
strings.Count(strstring,sub string ) int ;//计算有多少个子串sub


strings.Index(str string, sub string) int;
strings.Lastindex(str string, sub string)int;
如果找不到,return-1


strings.Repeat(str string, count int)string;//复制str几次,返回复制后的字符串
例如:str = “abc”;
str1 = strings.Repeat(str,3);
//这时str1的值为abcabcabc


strings.ToUpper(str string) string;
strings.ToLower(str string) string;



strconvpackage使用

package main
import (
		"fmt"
		"strconv"
		)

func main() {
	var ii int = 1100;
	var str2 string;
	var str1 = "1235";
	var err error;
	ii,err = strconv.Atoi(str1);
	if err == nil {
		fmt.Printf("%d\n",ii);
	}
	str2 = strconv.Itoa(ii);
	fmt.Printf(str2);
}



十条件语句

//**********************************
if condition {
} else {
}

//********************************
if initialization_statement; condition {
} else {
}
//*****switch**********************************************
package main
import (
		"fmt"
		)

func main() {
		var a int = 100;
		switch a {
			case  100: 
				fmt.Printf("a<100\n");
			case  111 :
				fmt.Printf("a > 111\n");
			default:
		}
}
//-------------------------------------------------------------------------------------------
package main
import (
		"fmt"
		)

func main() {
		var a int = 100;
		switch {
			case  a< 100: 
				fmt.Printf("a<100\n");
			case  a > 111 :
				fmt.Printf("a > 111\n");
			default:
				fmt.Printf("else\n");
		}
}
//***************************************************



十一 循环迭代



/******************************************************************
package main
import (
		"fmt"
		)

func main() {
	for i:= 0 ; i < 100 ; i++ {
		fmt.Printf("%d ",i);
	}
}
//----------------------------------------------------------------------------------------------------------



十二 自定义函数

1. func fun(a int) int {

}

2. func fun(a ,b int ) (int , int ) {

return a,b;

}

go语言里,是允许多返回值的



十三 使用defer(延缓)



package main
import (
		"fmt"
		)

func fun1(){
	fmt.Printf("abc\n");
	defer fun2();
// 等到fun1 执行结束时,再自动执行fun2();
	fmt.Printf("eft\n");
}

func fun2() {
	fmt.Printf("fun2\n");
}


func main() {
	fun1();
}



十四使用blank identifier “_”

package main
import (
		"fmt"
		)

func fun1()(int, int ){
	return 1,2;
}
func main() {
	var a int;
	a,_ = fun1();
// 用  _ 来记录不要记录的返回值
	fmt.Printf("%d\n",a);
}




有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:juxuny

查看原文:GO 语言学习

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1989 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传