m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

go言語の学習メモ3(関数、構造体)

関数

戻り値に複数の文字列を返却可能
package main

import (
	"fmt"
)

func main(){
	var (
		x int
		y int
		z string
	)

	// 関数への戻り値として複数の戻り値を返却できる
	x, y = add(10, 20)
	fmt.Print(x, y, "\n")

	// 関数への戻り値として複数の戻り値を返却できる
	z, y = test1(9999, "hogehoge")
	fmt.Print(z, y, "\n")

}

/**
 関数定義
 */
func add(a int, b int) (int, int){
	return a, b
}

/**
 関数定義
 */
func test1(a int, b string) (string, int){
	return b, a
}
結果
$ go run sample2.go 
10 20
hogehoge9999
$

構造体

なんかgo言語ではクラスがないみたいですね。
それに変わる方法があるようですけど…

定義
/**
 パッケージ定義
 */
package main

/**
 パッケージ
 */
import(
	"fmt"
)

/**
 構造体
 定義する場合はデータ型のみ
 */
type Car struct{
	name string
	weight int
}

/**
 メイン処理
 */
func main(){

	var (
		a Car
	)

	/**
	 varですでに定義している場合は初期化で値を設定しなくても良い
	 */
	a.name = "test"
	a.weight = 100
	fmt.Print(a.name, a.weight, "\n")
	
	/**
	 {}で挟むことで初期値を設定できる
	 */
	a = Car{"hoge", 200}
	fmt.Print(a.name, a.weight, "\n")

}

データや構造体を定義できるとのこと空の場合となんらかの値を設定することで初期化出来る場合もあるとかコンストラクタ関数などを用意する必要があるかも…

メソッド
/**
 パッケージ定義
 */
package main

/**
 パッケージ
 */
import(
	"fmt"
)

/**
 構造体
 定義する場合はデータ型のみ
 */
type Car struct{
	name string
	weight int
}

/**
 func (構造体のポインタ) 関数名(引数) (戻り値)
 で指定した構造体のメソッドとして利用できる
 */
func (p *Car) method1(){
	fmt.Print(p.name, "\n")
}

/**
 メイン処理
 */
func main(){

	var (
		a Car
	)

	/**
	 varですでに定義している場合は初期化で値を設定しなくても良い
	 */
	a.name = "test"
	a.weight = 100
	fmt.Print(a.name, a.weight, "\n")
	a.method1();

	/**
	 {}で挟むことで初期値を設定できる
	 */
	a = Car{"hoge", 200}
	fmt.Print(a.name, a.weight, "\n")
	a.method1();

}

関数での定義を一部変えて構造体のメソッドとして利用

定義

構造体の定義
/**
 構造体
 定義する場合はデータ型のみ
 */
type Car struct{
	name string
	weight int
}
構造体用のメソッド
/**
 func (構造体のポインタ) 関数名(引数) (戻り値)
 で指定した構造体のメソッドとして利用できる
 */
func (p *Car) method1(){
	fmt.Print(p.name, "\n")
}

※なんか構造体をfuncの前に定義したものをレシーバ?とかいうらしい

まとめ

構造体には他にもいろいろな機能を使用できるみたいだけど混乱するので一度整理し直す。c言語の時のポインタとかいう概念が復活してきたのでちょっと戸惑いそうだけどね。